2013-03-26 100 views
1

我正在建模有一些层次关系(作为父母关系),但另外一些非等级关系的一组节点。neo4j密码匹配查询匹配层次关系

比方说,这是一个家庭树,以每个人的出生国的关系,为简单起见

因此,每个出生的国家是一个节点,每个人都是一个节点,我也许可以在暗号由于工作的关系:

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

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

我想要做的是,例如,得到乡亲们的名单没有来自英国的任何祖先谁什么,或者FOL有来自日本祖先的ks等。我觉得这应该是一个合理的查询,但我对cypher很陌生,并且不知道如何构建它。

更新** 后的情况下更广泛的测试,我发现,查询不正确的一些工作完全。鉴于一名父母来自英格兰的父母和一名不是来自英格兰的祖父母的孩子,没有任何来自英​​格兰的祖先的儿童的询问不正确地将该孩子带回来自英格兰的父母。它看起来像我编写查询的方式,我得到了与英格兰有NULL关系的祖父母的回报。我的查询如下:

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

如果所有人的祖先出生在有问题的国家,它工作正常。

回答

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父

如果你有一个数据集方便在控制台上所有的人.neo4j.org也许可以看看发生了什么。

+0

谢谢,这工作完美。我的示例查询的问题最终成为我粗暴指责rel名称。 – Paul 2013-03-27 01:34:33