在特定节点类型上终止路径

Terminating a path on specific node types

我有类似 项目->组织->项目 的东西。所以一个组织可以有很多项目。我想从一个特定的项目开始查询,return 与该项目关联的所有节点(包括组织) 除了 其他项目。所以我写了这个故障查询:

match (p:Project {Code: 'XR-1'})-[r*1..3]-(n) where not(n:Project) return p, n, r

(根据我的理解)解析为:找到项目 XR-1 并获取 3 层深度内所有不是项目的节点。我得到的是一堆其他项目。它找到 运行XR-1 的组织,并且由于该组织还 运行 一堆其他项目,它 return 就是那些。

正确的写法是什么?

* 更新我 * 我已经意识到 where 子句是贪婪的,即它被应用于最长的匹配模式,而不是最短的。所以如果我做类似的事情:

match (p:Project {Code: 'XR-1'})-[r*1..3]-(n) 
where labels(n)[0] in ['Documentation'] return p, n, r

它 returns 项目 运行 由组织 运行s XR-1 因为他们有文档节点。它在文档节点上匹配并且无法过滤掉组织和项目。它很贪心。所以我需要的是一种将 where 子句应用于 在路径

上找到的每个 节点的方法

这个查询对你有用吗?

MATCH p=(proj:Project { Code: 'XR-1' })-[r*1..3]-(n)
WITH proj, RELATIONSHIPS(p) AS rs, TAIL(NODES(p)) AS ns
WHERE NONE (x IN ns WHERE x:Project)
RETURN proj, ns, rs;

它过滤掉包含任何额外 Project 节点的路径。

有关此查询有效的示例,请参阅 this console