【问题标题】:neo4j cypher query for hierarchical relationship matching用于层次关系匹配的 Neo4j 密码查询
【发布时间】:2013-03-26 06:01:30
【问题描述】:

我正在对一组节点进行建模,这些节点具有一些层次关系(作为父关系),但还有一些非层次关系。

为了简单起见,假设它是一个家谱,每个人都与出生国家有关系

所以每个出生国家都是一个节点,每个人都是一个节点,我可以用密码创建关系:

start parent=node(123), child=node(456)
create parent-[:PARENT]->child;

start person=node(123), country=node(789)
create person-[:BORN_IN]->country;

我想做的是,例如,获取一个没有任何来自英​​国的祖先的人的名单,或者有一个来自日本的祖先的人的名单,等等。我觉得这应该是一个合理的查询,但我是密码新手,不知道如何构建它。

更新** 在对案例进行更广泛的测试后,我发现查询在某些情况下并不完全正确。给定一个孩子的父母来自英格兰而祖父母不是来自英格兰,查询没有任何来自英​​格兰的祖先的孩子会错误地返回父母来自英格兰的孩子。看起来就像我编写查询的方式一样,我得到了祖父母与英国有 NULL 关系的回报。我的查询如下:

START n=node(*), ancestor=node(123)
MATCH n-[r:PARENT*]->o-[b?:BORN_IN]->ancestor
WHERE b IS NULL 
RETURN DISTINCT n;

如果此人的所有祖先都出生在相关国家/地区,则可以正常工作。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    您可以使用可变长度关系来包含所有子/祖先。我刚刚挑选了“确实有日本祖先的人”:

    START country=<lookup Japan>
    match (child)-[:PARENT*0..5]->(parent)-[:BORN_IN]->(country)
    return child
    

    注意:没有尝试过,但逻辑上应该这样做。我还选择了随机深度 5。

    MATCH a-[:PARENT]->b-[:BORN_IN]->z 
    

    如您的示例中所述应该找到所有父母在 z 出生的人 (a)

    如果你在 console.neo4j.org 上有一个方便的数据集,可以看看发生了什么。

    【讨论】:

    • 谢谢,效果很好。我的示例查询的问题最终是我对 rel 名称的粗心大意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2013-11-11
    相关资源
    最近更新 更多