我有三个起始节点,它们返回的路径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
。谢谢您的帮助!
答案 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