【问题标题】:From a set of nodes, get all nodes in the set that are not a child of a node in that set从一组节点中,获取集合中不是该集合中某个节点的子节点的所有节点
【发布时间】: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] 关系,但是如果我有许多级别的节点,这可能会变慢。有没有更好的查询来做到这一点?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    你可以尝试使用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
    

    【讨论】:

      猜你喜欢
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多