终止特定节点类型

时间:2015-08-11 02:24:39

标签: neo4j operators cypher

我有像 Project-> Organisation-> Project 这样的东西。所以一个组织可以有很多项目。我想从特定项目开始查询,并返回与项目相关的所有节点(包括组织)以外的其他项目。所以我写了这个错误的查询:

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

解析(据我的理解):找到项目XR-1并获得3层深度内不是项目的所有节点。我得到的是一堆其他项目。它找到了运行XR-1的组织,并且由于该组织还运行了许多其他项目,它会返回这些项目。

写这个的正确方法是什么?

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

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

它返回由运行XR-1的组织运行的项目,因为它们具有文档节点。它在文档节点上匹配,无法过滤掉组织和项目。它太贪心了。所以我需要的是一种方法,将where子句应用于路径上的每个节点

1 个答案:

答案 0 :(得分:1)

此查询是否适合您?

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