我在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'标记的节点之间还有其他标记的节点
答案 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
。