Neo4j:与中间节点的可变长度关系

mxg2im7a  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(142)

我有一个neo4j数据库,有两种类型的节点标签:person和email。一个email节点总是通过关系'EMAIL_FROM'和'EMAIL_TO'连接两个person节点,这样可以查询关系如下:

match (p1:Person)-[:EMAIL_FROM]->(:Email)-[:EMAIL_TO]->(p2:Person) return p1, p2

字符串
我试着写一个可变长度的关系查询,它从某个人节点开始,找到所有其他人节点,可以通过中间电子邮件节点到达。这是我尝试的:

match (p1:Person where p1.name='Jeff')-[:EMAIL_FROM*]->(:Email)-[:EMAIL_TO*]->(p2:Person) return p1, p2


不幸的是,这并不像我想象的那样工作,并且通过迭代模式一次,只能从'Jeff'节点直接返回,但随后它停止了,尽管我知道在第一次迭代中到达的节点本身具有传出的'EMAIL_FROM'关系。

e0uiprwp

e0uiprwp1#

假设你想持续跟踪发送电子邮件的模式,你可以使用量化的路径模式来做到这一点:

MATCH (p1:Person where p1.name='Jeff') (()-[:EMAIL_FROM]->(:Email)-[:EMAIL_TO]->(:Person))+ (p2)
RETURN DISTINCT p2

字符串
这将重复模式的最后一部分,下限为1,没有上限。对于任何非平凡的图形,这可能无法完成,并且您可能会遇到堆问题。我们建议如果可能的话设置上限。
另一种方法是使用APOC过程,即路径浏览器过程,因为这些过程在查找不同的可达节点方面可能更有效。

MATCH (p1:Person where p1.name='Jeff') 
CALL apoc.path.subgraphNodes(p1, {relationshipFilter:'EMAIL_FROM>, EMAIL_TO>', labelFilter:'>Person'}) YIELD node
RETURN node


这将重复传出的:EMAIL_FROM和:EMAIL_TO关系,仅返回:Person节点,并且此过程使用的唯一性应仅返回不同的结束节点。

相关问题