neo4j cypher查询分层关系匹配

时间:2013-03-26 06:01:30

标签: neo4j cypher

我正在建模一组节点,这些节点具有一些层次关系(作为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的新手,并且不知道如何构建它。

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

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

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

1 个答案:

答案 0 :(得分:4)

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

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上有一个方便的数据集,可以看看发生了什么。