【问题标题】:Given a property on a relationship, how to return the path and node attributes?给定关系上的属性,如何返回路径和节点属性?
【发布时间】:2014-09-16 00:56:04
【问题描述】:

我是 neo4j 的新手,正在尝试将最长的路径映射到已知节点。在此示例中,只有一条直线路径。 (例如,node1 => node2 => node3 => node4 => node5 => node6)。如何编写该查询?

复杂之处在于仅限制关系和特定属性。例如,所有的关系都是类型:KNOWS,但是它上面有一个“信号”属性,我只想为关系 r:KNOWS 运行查询,其中 r.signal = 10。

下面是获取路径中最后两个节点的方法:

MATCH (end)<-[r:knows]-(node)
WHERE r.signal = 10
AND end.name = 4
RETURN node.name, end.name, r.signal

这是我下一次尝试使用 * 来获取所有长度,以及过滤器和提取器的组合来处理集合:

MATCH (end)<-[r:knows*]-(node)
WHERE end.name = 4
WITH end, node, [x IN r WHERE x.signal = 10 | x.signal] as signals
RETURN node.name, end.name, signals

但它仍然不太正确,因为它返回所有迭代,并且只返回对。我想找到最长的路径,并返回所有节点名称的数组(一次不只是一对)。非常感谢任何有关如何解决此问题的指针,或有用的教程链接。我已经完成了 neo4j 在线培训。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    这是一种获得最大长度/最长路径的方法:

    MATCH p=(end {name: 4})<-[r:knows*]-(node)
    WITH max(length(p)) as longestPathLength
    MATCH p2=(end {name: 4})<-[r:knows*]-(node)
    WITH [x IN nodes(p2) | x.signal] as signals, 
         p2 as p2, 
         longestPathLength as longestPathLength
    WHERE length(p2) = longestPathLength
    RETURN p2, signals;
    

    首先,您需要匹配路径并将其分配给变量,此处为pp2。您可以像以前一样使用集合函数提取节点名称,跨越nodes(p2)。最后,要找到最长的路径长度,只需找到所有路径,并选择最大长度的路径。然后返回并仅从恰好具有该长度的路径中提取节点名称。

    这可能不是最有效的方法,但它看起来很有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多