我正在对一组节点进行建模,这些节点具有一些层次关系(作为父关系),但还有一些非层次关系。
为简单起见,假设这是一个与每个人的出生国关系的家谱
所以每个出生国家都是一个节点,每个人都是一个节点,我可以用密码创建关系:
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;
如果此人的所有祖先都出生在相关国家,则效果很好。