1

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

为简单起见,假设这是一个与每个人的出生国关系的家谱

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

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;

如果此人的所有祖先都出生在相关国家,则效果很好。

4

1 回答 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 

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

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

于 2013-03-26T06:21:43.257 回答