Neo4j 按路径中未返回的标签查找相关节点

Neo4j 按路径中未返回的标签查找相关节点,neo4j,cypher,Neo4j,Cypher,我有三个开始节点返回路径p1、p2、p3,它们都以公共节点com结束。三个路径中的所有节点都有标签type。每个路径中的零个或多个节点具有第二个标签类型文件。我想找到所有文件节点,这些节点是不在路径p1、p2、p3中的节点com的父节点 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

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

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
。谢谢你的帮助

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

尝试将
节点(p1)作为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

作为可能的轻微改进:如果起始节点和结束节点不可能是同一节点,则可变长度路径应使用
1
(默认值)的下限,而不是
0
。这恰好适用于您的特定示例中的所有四个可变长度路径(但可能并不总是如此,具体取决于您的实际使用情况)。@Damon同样重要的是,在每个路径匹配后收集节点(并添加到共享集合),而不是在最后收集。您遇到了一个乘法基数问题(分析您的查询,以查看数据库命中率和行数放大)。@InverseFalcon如果匹配一个路径而不是3,并将where子句中起始节点的id与in匹配,该怎么办。你喜欢这3个id列表中的id吗?