【发布时间】:2017-02-08 20:30:59
【问题描述】:
我有一个节点,比如说人,它拥有节点。我想获取该人拥有的所有节点,这些节点不是该人拥有的节点的子节点。此外,一个孩子可以是多个层次的深度(即,如果 A 是 B 的孩子,B 是 C 的孩子,那么 A 是 C 的孩子)。
例如,如果我们有
A <-[:CHILD_OF]- B <-[:CHILD_OF]- C E <-[:CHILD_OF]- F
^
|
[:CHILD_OF]
|
D
并且人拥有A、F、D和C,那么只有A和F应该返回,因为D是A的孩子,C是A的孩子
这是我目前的做法:
MATCH (person)-[:OWNS]->(owned) WITH COLLECT(DISTINCT owned) AS owned
RETURN FILTER(x in owned WHERE ALL (y in owned WHERE NOT ((x)-[:CHILD_OF*..20]->(y)))) AS children
但是如果一个孩子的深度超过 20 层,这个查询就会返回它。我可以使用 [:CHILD_OF*] 来匹配无限数量的 [:CHILD_OF] 关系,但是如果我有许多级别的节点,这可能会变慢。有没有更好的查询来做到这一点?
【问题讨论】: