在Neo4j中,如果至少有一个节点(相关但可能不是结果)具有特定属性,则返回结果

在Neo4j中,如果至少有一个节点(相关但可能不是结果)具有特定属性,则返回结果,neo4j,cypher,Neo4j,Cypher,我有一个由一组不相交的族谱组成的图 我有一个工作查询,其中有几个可选匹配语句,允许我仅获取主要人物家谱中某个人的直系父母和兄弟姐妹,假设我们对这些亲属感兴趣: MATCH (p:Person {main_person: 'y'}) OPTIONAL MATCH (p)<-[]-(parent:Person) WHERE parent.`person_of_interest` = 'y' OPTIONAL MATCH (parent:Person)-[]->(sib:Person)

我有一个由一组不相交的族谱组成的图

我有一个工作查询,其中有几个
可选匹配
语句,允许我仅获取
主要人物
家谱中某个人的直系父母和兄弟姐妹,假设我们对这些亲属感兴趣:

MATCH (p:Person {main_person: 'y'})
OPTIONAL MATCH (p)<-[]-(parent:Person)
  WHERE parent.`person_of_interest` = 'y'
OPTIONAL MATCH (parent:Person)-[]->(sib:Person)
  WHERE sib <> p
  AND sib.`person_of_interest` = 'y'
RETURN
  p, parent, sib;  
也许它应该更像:

MATCH (p:Person {main_person: 'y'})
OPTIONAL MATCH (p)<-[]-(parent:Person)
OPTIONAL MATCH (parent:Person)-[]->(sib:Person)
WHERE sib <> p
HAVING <condition here>
RETURN
p, parent, sib; 
MATCH(p:Person{main_Person:'y'})
可选匹配(p)(同胞:人)
sib p在哪里
有
返回
p、 父母、兄弟姐妹;
如果这是SQL,我会尝试使用一个临时表来实现

这些都没有真正起作用


感谢阅读此文。

[更新以回答更新的问题]

此查询可能适用于您(也可能内存不足或似乎永远运行):

MATCH(p:Person{main_Person:'y'})
存在的地方((p)-[*0..]({test_me:'y'}))
可选匹配(p)(同胞:人)
其中sib p和sib.person\u of_interest='y'
返回p,收集(父项)作为父项,收集(sib)作为sib;
[*0..]
语法表示可变长度的关系搜索,其中匹配路径可以有0个或多个关系。查询使用
0
下限而不是
1
(这是默认值)的原因是:我们还想测试
p
本身是否具有所需的
test\me
属性值

然而,可变长度关系搜索因使用大量内存或在未指定上限时需要很长时间才能完成而臭名昭著,因此通常查询会指定合理的上限(例如,
[*0..5]


顺便说一下,您可能应该将诸如“y”之类的值传递为,而不是硬编码。

[更新以回答更新的问题]

此查询可能适用于您(也可能内存不足或似乎永远运行):

MATCH(p:Person{main_Person:'y'})
存在的地方((p)-[*0..]({test_me:'y'}))
可选匹配(p)(同胞:人)
其中sib p和sib.person\u of_interest='y'
返回p,收集(父项)作为父项,收集(sib)作为sib;
[*0..]
语法表示可变长度的关系搜索,其中匹配路径可以有0个或多个关系。查询使用
0
下限而不是
1
(这是默认值)的原因是:我们还想测试
p
本身是否具有所需的
test\me
属性值

然而,可变长度关系搜索因使用大量内存或在未指定上限时需要很长时间才能完成而臭名昭著,因此通常查询会指定合理的上限(例如,
[*0..5]


顺便说一下,您可能应该将诸如“y”之类的值传递为,而不是硬编码它们。

您肯定走对了路,我认为您已经得到了答案,即使您没有意识到这一点

描述中的内容作为查询的开始,只需进行一些修改:

MATCH pattern=(p:Person{main_person: 'y'})-[*]-()
WHERE ANY (person IN nodes(pattern) WHERE person.test_me = 'y')
WITH p
...

变量关系可以让你考虑树中的每一个人(如果你的图表中有非家庭关系,你会想在你的关系中使用类型,以确保你只考虑一个家庭的树),以及MIN人。如果p的家族树中没有人拥有您想要的属性,那么p将为null,使用p的任何后续匹配都不会产生任何结果。这将允许您自由指定查询的其余部分,并且只要所有匹配项都包含p,就不应该在没有所需特性值的族的末尾得到任何结果


EDIT修复了我的查询,ANY()子句写得不正确。

你肯定走对了路,我想你已经有了答案,即使你没有意识到

描述中的内容作为查询的开始,只需进行一些修改:

MATCH pattern=(p:Person{main_person: 'y'})-[*]-()
WHERE ANY (person IN nodes(pattern) WHERE person.test_me = 'y')
WITH p
...

变量关系可以让你考虑树中的每一个人(如果你的图表中有非家庭关系,你会想在你的关系中使用类型,以确保你只考虑一个家庭的树),以及MIN人。如果p的家族树中没有人拥有您想要的属性,那么p将为null,使用p的任何后续匹配都不会产生任何结果。这将允许您自由指定查询的其余部分,并且只要所有匹配项都包含p,就不应该在没有所需特性值的族的末尾得到任何结果


EDIT修正了我的问题,ANY()子句写得不正确。

cybersam,我应该向你道歉。我真的很感谢你回答了这个问题,但我不得不回去编辑这个问题。我对此感到遗憾!!!这真的很有趣。我注意到,
可选匹配
语句的顺序有很大的不同。在我的“现实生活”问题中,顺序颠倒了,我没有得到任何结果。我最终改变了顺序,一切如期进行。无论如何,再次感谢你的耐心和帮助。塞伯山姆,我应该向你道歉。我真的很感谢你回答了这个问题,但我不得不回去编辑这个问题。我对此感到遗憾!!!这真的很有趣。我注意到,
可选匹配
语句的顺序有很大的不同。在我的“现实生活”问题中,顺序颠倒了,我没有得到任何结果。我最终改变了顺序,一切如期进行。无论如何,再次感谢您的耐心和帮助。看起来
节点(模式)
中的某些东西正在减慢速度。您可以取消并对查询运行解释,以查看哪里不起作用。其他一些需要检查的东西…无论您使用什么属性来匹配特定的人(您的主要人),都应该唯一地约束。您可能还想从主用户那里检查匹配的树的大小,因为变量关系
MATCH pattern=(p:Person{main_person: 'y'})-[*]-()
WHERE ANY (person IN nodes(pattern) WHERE person.test_me = 'y')
WITH p
...