【问题标题】:Neo4j, consequetive MATCH path queriesNeo4j,后续 MATCH 路径查询
【发布时间】:2020-03-17 13:42:47
【问题描述】:

我试图编写一个包含多个匹配项的 Cypher 查询以获取多个路径

查询

MATCH (a:A) --> (b:B) where b.uid="asdfas"
MATCH path = (a) -> (leaf) with collect(path) as paths
MATCH another_path = (b) -> (leaf) with collect(another_path) as paths_2

RETURN paths, paths_2

结果

Neo.ClientError.Statement.SyntaxError: Variable `paths` not defined 
"RETURN paths, paths_2"

return 子句忘记了path

与上面不同,如果 MATCH 只产生节点而不是路径列表

MATCH (a:A) --> (b:B) where b.uid="asdfas"
MATCH path = (a) -> (leaf) with collect(path) as paths
MATCH (b) --> (c:C) 

RETURN paths, c

上述查询完美执行。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    WITH 子句导致所有现有变量变为未绑定除了WITH 子句继续传递的变量。

    第一个WITH必须通过b,这样后面的MATCH才能使用。而第二个WITH 必须通过paths 才能返回:

    MATCH (a:A)-->(b:B) WHERE b.uid="asdfas"
    MATCH path = (a)->()
    WITH b, COLLECT(path) AS paths
    MATCH another_path = (b)->()
    WITH paths, COLLECT(another_path) AS paths_2
    RETURN paths, paths_2
    

    更好的是,实际上不需要您的第二个WITH:

    MATCH (a:A)-->(b:B) WHERE b.uid="asdfas"
    MATCH path = (a)->()
    WITH b, COLLECT(path) AS paths
    MATCH another_path = (b)->()
    RETURN paths, COLLECT(another_path) AS paths_2
    

    【讨论】:

      【解决方案2】:

      在您的第一个查询中,您需要将paths 添加到您的最终with 语句中,以便它可用于RETURN 语句。

      MATCH another_path = (b) -> (leaf) with collect(another_path) as paths_2, paths

      就个人而言,我喜欢将WITH(和WHERE)语句放在不同的行中,以使这些事情可能更清楚地了解正在传递的内容

      MATCH (a:A) --> (b:B) 
      WHERE b.uid="asdfas"
      
      MATCH path = (a) -> (leaf) 
      WITH collect(path) as paths
      
      MATCH another_path = (b) -> (leaf) 
      WITH collect(another_path) as paths_2, paths
      
      RETURN paths, paths_2
      

      【讨论】:

      • 如上面的答案(标记为正确),节点“b”应与“路径”一起传递。否则 (b) 将匹配数据库中的每个节点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多