【问题标题】:how to get the last node in path in neo4j?如何获取neo4j路径中的最后一个节点?
【发布时间】:2013-11-15 08:26:55
【问题描述】:

在此密码查询中,将返回与 STATUS="on" 属性相关的节点之间的最长路径/路径,但我还想获取路径/路径的最后一个节点。

查询:

START n=node(*)
MATCH p=n-[rels:INCLUDE*]->m 
WHERE ALL (rel IN rels 
  WHERE rel.status='on') 
WITH COLLECT(p) AS paths, MAX(length(p)) AS maxLength 
RETURN FILTER(path IN paths 
  WHERE length(path)= maxLength) AS longestPaths

我应该如何将它添加到查询中? 谢谢。

【问题讨论】:

    标签: neo4j cypher path-finding


    【解决方案1】:

    这将给出两个数组。第一个数组是每个路径中的最后一项,第二个是每个路径:

    START n=node(*)
    MATCH p=n-[rels:INCLUDE*]->m 
    WHERE ALL (rel IN rels 
      WHERE rel.status='on') 
    WITH COLLECT(p) AS paths, MAX(length(p)) AS maxLength 
    WITH FILTER(path IN paths WHERE length(path)= maxLength) AS longestPaths
    RETURN EXTRACT(path IN longestPaths | LAST(path)) as last, longestPaths
    

    【讨论】:

    • @LameCoder 有没有办法获取最后一个节点而不是路径我得到一些 JSON 集合而不是节点?
    • 要将其转换为 Neo4j 2.x,请将下面的 2.x cmets 中的 LAST(path) 更改为 LAST(nodes(path))。无论如何,这对我有用。
    【解决方案2】:

    由于路径是一个集合,您可以应用LAST 函数。

    【讨论】:

    • 从 neo4j 2.0 开始,路径不是集合,不能直接在其上运行 LAST。
    • 你可以使用last(nodes(mypath))
    【解决方案3】:

    此示例用于从节点的每个分支中获取最后一个节点
    next_action 关系

    MATCH p=(a:acct)-[:next_action*]->(c)
    WITH COLLECT({node:c, l:length(p)}) AS paths, MAX(length(p)) AS maxLength, a.uid as uid
    WITH [x IN paths WHERE x.l= maxLength] AS last_node
    RETURN last_node
    

    有点奇怪,在 Neo4j GUI 界面中运行这个查询会带来所有最后的节点。从 py2neu 运行相同的查询不会。 从 py2neo 运行时,以下修改将起作用

    MATCH p=(a:acct)-[:next_action*]->(c)
    WITH COLLECT({node:c, l:length(p)}) AS paths, MAX(length(p)) AS maxLength, a.uid as uid
    WITH [x IN paths WHERE x.l= maxLength] AS last_node
    WITH COLLECT(last_node) as last_nodes
    RETURN last_nodes
    

    【讨论】:

      【解决方案4】:

      从 Neo4J 4.X 开始,不再支持 FILTER(),因此可以将其替换为 REDUCE()。 方法如下::

      START n=node(*)
      MATCH p=n-[rels:INCLUDE*]->m 
      WHERE ALL (rel IN rels 
        WHERE rel.status='on') 
      WITH COLLECT(p) AS paths, MAX(length(p)) AS maxLength 
      // WITH FILTER(path IN paths WHERE length(path)= maxLength) AS longestPaths
      WITH REDUCE( newPaths = [], path in paths |
                  CASE
                  WHEN length(path)= maxLength THEN newPaths + [path]
                  END ) AS longestPaths
      RETURN EXTRACT(path IN longestPaths | LAST(path)) as last, longestPaths
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-20
        • 2019-07-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多