通过标签查找路径中未返回的相关节点

时间:2019-03-06 01:35:06

标签: neo4j cypher

我有三个起始节点,它们返回的路径p1,p2,p3都结束于公共节点com。这三个路径中的所有节点都具有标签type。每个路径中的零个或多个节点具有第二个标签类型file。我想找到所有file节点,它们是节点com的父节点,不在路径p1,p2,p3中。

MATCH p1=(s1:type{id:882591})-[:sub*0..35]->(com:type{id:882680})
MATCH p2=(s2:type{id:541990})-[:sub*0..35]->(com) 
MATCH p3=(s3:type{id:542007})-[:sub*0..35]->(com)  
WITH com, collect(p1) as pa, collect(p2) as pb, collect(p3) as pc
OPTIONAL MATCH (f:file)-[:sub*0..35]->(com)
WHERE NOT f IN pa AND NOT f IN pb AND NOT f IN pc
RETURN DISTINCT f limit 100

这是我得到的最接近的,但它仍然返回作为file父级的所有com节点-甚至是路径中的那些节点。如果删除路径更快,则每个路径的第一个节点和最后一个节点com将永远不会带有标签file。谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

在路径p1,p2和p3上收集将是路径列表,而不是节点列表。

尝试nodes(p1) as pa等,以收集节点。

编辑:

  

如@InverseFalcon所建议,上述查询存在基数问题。

您可以创建这些节点ID的集合并将其展开以具有单个匹配项来查找这些路径。

WITH [882591,541990,542007] as typeIds
UNWIND typeIds as typeId
MATCH p=(s1:type{id:typeId})-[:sub*0..35]->(com:type{id:882680})
WITH com, nodes(p) as ps
OPTIONAL MATCH (f:file)-[:sub*0..35]->(com)
WHERE NOT f IN ps
RETURN DISTINCT f 
LIMIT 100