首页 文章

neo4j cypher查询分层关系匹配

提问于
浏览
1

我正在建模一组节点,这些节点具有一些层次关系(作为PARENT关系),但另外还有一些非层次关系 .

让我们说这是一个家庭树,与每个人的出生国家有关系,为简单起见

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

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

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

我想做的是,例如,获取一份没有来自英格兰的祖先的人,或者有来自日本的祖先的人,或者类似的人 . 我觉得这应该是一个合理的查询,但我是cypher的新手,并且不知道如何构建它 .

**** **UPDATE **** 在对案件进行更广泛的测试之后,我完全正确地对待了一些案例 . 鉴于一名来自英格兰的父母和不是来自英格兰的祖父母的孩子,对没有来自英格兰的祖先的孩子的查询错误地将该孩子与来自英格兰的父母一起归还 . 它看起来像我编写查询的方式,我获得了与英格兰有NULL关系的祖父母的回报 . 我的查询如下:

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

如果所有人的祖先都出生在有关国家,那就可以了 .

1 回答

  • 4

    您可以使用可变长度关系来包括所有子/祖先 . 我刚选择了“有日本祖先的人”:

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

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

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

    如你的例子中所提到的,应该找到所有在a中出生的父母的人(a)

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

相关问题