从一组节点中,获取集合中不是该集合中节点的子节点的所有节点

时间:2017-02-08 20:30:59

标签: neo4j cypher

我有一个拥有节点的节点,比方说人。我希望获得该人拥有的所有节点,这些节点不是该人拥有的节点的子节点。另外,一个孩子可能是多层深的(即如果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]关系,但如果我有很多级别的节点,这可能会变慢。有更好的查询吗?

1 个答案:

答案 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