我有一个拥有节点的节点,比方说人。我希望获得该人拥有的所有节点,这些节点不是该人拥有的节点的子节点。另外,一个孩子可能是多层深的(即如果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]关系,但如果我有很多级别的节点,这可能会变慢。有更好的查询吗?
答案 0 :(得分:2)
您可以尝试使用函数shortestPath
:
MATCH (person)-[:OWNS]->(owned) WITH COLLECT(DISTINCT owned) AS owned
FILTER(x IN owned WHERE ALL (
y IN owned WHERE NOT CASE WHEN shortestPath((x)-[:CHILD_OF*]->(y)) IS NULL
THEN TRUE
ELSE FALSE
END
)) AS children