【问题标题】:Match Only Full Paths in Neo4J with Cypher (not sub-paths)仅将 Neo4J 中的完整路径与 Cypher 匹配(不是子路径)
【发布时间】:2015-01-22 02:05:30
【问题描述】:

如果我有如下图(嵌套可以针对任意数量的节点进行):

(a)-[:KNOWS]->(b)-[:KNOWS]->(c)-[:KNOWS]->(d)-[:KNOWS]->(e)
               |             |
               |            (i)-[:KNOWS]->(j)
               |
              (f)-[:KNOWS]->(g)-[:KNOWS]->(h)-[:KNOWS]->(n)
                             |
                            (k)-[:KNOWS]->(l)-[:KNOWS]->(m)

如何检索所有全长路径(在这种情况下,从 (a)-->(m)(a)-->(n)(a)-->(j)(a)-->(e)?查询还应该能够返回没有关系的节点给定类型。

到目前为止,我只是在做以下事情(我只想要 id 属性):

MATCH path=(a)-[:KNOWS*]->(b)
RETURN collect(extract(n in nodes(path) | n.id)) as paths

我需要这些路径,以便在编程语言(在本例中为 clojure)中我可以创建一个这样的嵌套映射:

{"a" {"b" {"f" {"g" {"k" {"l" {"m" nil}}
                     "h" {"n" nil}}}
           "c" {"d" {"e" nil}
                "i" {"j" nil}}}}}

是否可以直接使用查询生成地图?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    只需要做类似的事情,这对你的例子有效,找到所有没有传出[:KNOWS]的节点:

    match p=(a:Node {name:'a'})-[:KNOWS*]->(b:Node)
    optional match (b)-[v:KNOWS]->()
    with p,v
    where v IS NULL
    return collect(extract(n in nodes(p) | n.id)) as paths
    

    【讨论】:

      【解决方案2】:

      这是一个可以帮助您入门的查询。当有一条没有分叉的链时,此查询将仅返回最长的节点链。它像您一样匹配所有路径,但仅通过使用限制返回最长的路径来减少结果。

      MATCH p=(a:Node {name:'a'})-[:KNOWS*]->(:Node)
      WITH length(p) AS size, p
      ORDER BY size DESC
      LIMIT 1
      RETURN p AS Longest_Path
      

      我认为这就是您问题的第二部分,其中有多个路径。它查找最后一个节点没有 outbound :KNOWS 关系以及起始节点没有 inbound :KNOWS 关系的路径。

      MATCH p=(a:Node {name:'a'})-[:KNOWS*]->(x:Node)
      WHERE NOT x-[:KNOWS]->()
      AND NOT ()-[:KNOWS]->(a)
      WITH length(p) AS size, p
      ORDER BY size DESC
      RETURN reduce(node_ids = [], n IN nodes(p) | node_ids + [id(n)])
      

      【讨论】:

      • 没有limit 1 我得到了我需要的一切以及子路径.. 必须有办法过滤掉它们..
      • 在你的第一个问题中,你不想要最长的路径吗?
      • 我可能不清楚。我需要从根到叶的所有路径——包括没有孩子的根——这样我就可以使用它们在 clojure 中使用assoc-in 构建地图(我不确定你是否熟悉......)。
      • @merb,我更新了第二部分的答案,你有多个端点。我认为它符合要求。它包括最长的链并且不返回任何子段。
      猜你喜欢
      • 1970-01-01
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      相关资源
      最近更新 更多