【问题标题】:Neo4j Cypher - Terminating conditions when using variable level pathsNeo4j Cypher - 使用可变级别路径时的终止条件
【发布时间】:2014-04-04 07:53:07
【问题描述】:

我有一个以循环方式建模的链表,如下所示:

(u:User)
-[:LINK]->(a:NODELINK {linkId: 'aa'})
-[:LINK]->(b:NODELINK {linkId: 'bb'})
-[:LINK]->(c:NODELINK {linkId: 'cc'})
-[:LINK]->(d:NODELINK {linkId: 'dd'})
-[:LINK]->(u)

当我从节点 (b:NODELINK {linkId: 'bb'}) 开始查询它时,我想匹配所有节点,直到我到达列表的结尾/开头。 (用户节点)

当我运行以下查询时:

MATCH (u:USER)
WITH u
MATCH (nl:NODELINK)-[:LINK*]->(m)
WHERE nl.linkId = 'bb' AND m <> u
RETURN m

它返回以下节点

(3:NODELINK {linkId:'cc'})
(4:NODELINK {linkId:'dd'})
(1:NODELINK {linkId:'aa'})
(2:NODELINK {linkId:'bb'})

如您所见,我的查询环绕并从列表的开头开始返回节点。我想在用户节点处终止,只返回列表末尾之前的节点

(3:NODELINK {linkId:'cc'})
(4:NODELINK {linkId:'dd'})

我创建了一个图表,demonstrates the issue here

如何查询以从感兴趣的节点链接开始,并在到达用户节点之前返回所有节点?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    您的 WHERE 子句限制路径中的第一个和最后一个节点,但不限制中间节点,所以是的,查询可以匹配包含用户节点的路径。

    不要匹配许多路径并仅返回结束节点,而是尝试匹配从“cc”节点到用户节点的一个路径,并返回该路径中的所有节点(如果您不希望用户返回最后一个节点除外节点)。

    MATCH path=(nl:NODELINK {linkId:'cc'})-[:LINK*]->(u:USER)
    RETURN nodes(path)
    

    RETURN nodes(path)[..-1]
    

    如果要返回除最后一个以外的所有节点。

    【讨论】:

    • 就是这样。有趣的是,我不知道您可以通过在路径中指定 linkId 来进行匹配(不使用 WHERE linkId = 'cc'。
    • 我有一个关于解压缩路径以允许进一步匹配的问题,stackoverflow.com/questions/22184924/…
    【解决方案2】:

    试试下面的查询。我认为您应该在第一个 MATCH 子句中将 NODELINK 带到您想要开始遍历的位置,因为它将指出您的图表从哪里开始,而不是仅匹配 USER 标签上的 user 节点。

    MATCH (nl:NODELINK)
    WHERE nl.linkId = 'aa'
    WITH nl
    MATCH p=(nl)-[:LINK*1..]->(m:USER)
    RETURN filter(t IN nodes(p) 
                  WHERE t <> nl) AS nodes
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-06
      • 2017-06-14
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多