Neo4j获取的节点在其祖先

时间:2017-05-23 17:21:16

标签: neo4j cypher

我在neo4j中有一个树状结构,我想找到第一个带有特定标签的节点,该标签有一条到祖先的路径,并且在该路径中没有相同类型的节点。

例如:

  /  (:Y) <- (a:X)
A <- (:Y) <- (c:X) <- (:Y) <- (d:X) <- (e:X)
  \  (b:X)<- (f:X)
  \  (g:X)

在这种情况下,'A'是祖先,我想要节点a,b,c,g,因为它们有标签'X',并且没有被另一个带有标签'X'的节点与祖先分开/ p>

我从查询开始:

match (c :X)-[:X*1]->(A) return c

但它只返回[b,g]而不是[c,g],因为祖先和'X'标记的节点之间还有其他标记的节点

2 个答案:

答案 0 :(得分:2)

为此,您需要APOC Procedures,其中一些path expander procedures中的配置选项可以完全按照您的要求执行。

您需要使用终止运算符/来使用labelFilter,这意味着路径扩展将停止在给定标签的第一个节点,并且只返回这些标签的节点。

类似的东西:

...
// assume you've already matched to ancester 'a'
CALL apoc.path.subgraphNodes(a, {labelFilter:'/X'}) YIELD node
RETURN node

那应该返回第一个:来自起始节点的每条路径上的X个节点。

答案 1 :(得分:1)

首先,获取您的祖先节点(我假装它将拥有:祖先标签,在这种情况下,您可能需要调整查询以反映现实。)

MATCH (a:Ancestor),然后获取所有连接的节点:X标签最多2级深度:MATCH (a)<-[*0..2]-(n:X)并确保这些n个节点未连接到其间的其他X:WHERE NOT (n)-->(:X)并返回:RETURN n

所以整个cypher查询看起来像这样: MATCH (a:Ancestor) MATCH (a)<-[*0..2]-(n:X) WHERE NOT (n)-->(:X) RETURN n