从cypher

时间:2017-03-03 07:42:19

标签: neo4j cypher

如何删除cypher返回的较小路径,这些路径已包含在同一结果中包含的其他较长路径中?

例如,如果我的密码是MATCH path=(n)-[:REL*]->(m) where id(n)=<some id> return path。因此,它返回包含任意数量类型[:REL]的传出关系的所有路径。但是,它为更长的路径(包含2个以上的节点)返回多个路径,每个路径包含指向起始节点的较长路径中的后续节点的路径。例如,它可能会返回以下路径:

(a)-[:REL]->(b)
(a)-[:REL]->(b)-[:REL]->(c)
(a)-[:REL]->(b)-[:REL]->(c)-[:REL]->(f)
(a)-[:REL]->(b)-[:REL]->(d)
(a)-[:REL]->(c) 
(a)-[:REL]->(c)-[:REL]->(e)

您可以注意到(a)-[:REL]->(b)包含在所有

  • (a)-[:REL]->(b)-[:REL]->(c)-[:REL]->(f)
  • (a)-[:REL]->(b)-[:REL]->(c)
  • (a)-[:REL]->(b)-[:REL]->(d)

(a)-[:REL]->(c)包含在(a)-[:REL]->(c)-[:REL]->(e)

(a)-[:REL]->(b)-[:REL]->(c)包含在(a)-[:REL]->(b)-[:REL]->(c)-[:REL]->(f)

我不希望(a)-[:REL]->(b)(a)-[:REL]->(c)(a)-[:REL]->(b)-[:REL]->(c)出现在输出中,因为它们是其他路径的一部分。

这可能与密码一起使用吗?不知怎的,我觉得(虽然觉得这感觉很奇怪),cypher应该在关系规范之前允许!(逻辑上没有)暗示特定类型的关系不会离开(或进入)节点。我本来可以写的:

MATCH path=(n)-[:REL*]->(m)!-[:REL]->() where id(n)=<some id> return path

这将禁止那些较小的路径。

无论如何,我怎么能在密码中做到?

1 个答案:

答案 0 :(得分:1)

您可以为此添加过滤,仅返回结束节点没有传出:REL关系的路径:

MATCH path=(n)-[:REL*]->(m) 
where id(n)=<some id> and not (m)-[:REL]->()
return path