【问题标题】:Cypher: WITH is required between CREATE and MATCHCypher:在 CREATE 和 MATCH 之间需要 WITH
【发布时间】:2015-11-16 08:48:05
【问题描述】:

我想创建一组节点,并获取 CREATE 语句的结果。如果我在 Neo4j 浏览器中执行此操作...

CREATE (a:Group {name: "a"})
     , (b:Group {name: "b"})
     , (c:Group {name: "c"})
MATCH (r:Room)
RETURN r

...我收到了Neo.ClientError.Statement.InvalidSyntax error: WITH is required between CREATE and MATCH

如果我创建一个虚拟 WITH 语句,我不会收到此错误...

CREATE (a:Group {name: "a"})
     , (b:Group {name: "b"})
     , (c:Group {name: "c"})
WITH a as a
MATCH (r:Room)
RETURN r

...或者如果我将其分解为 2 个单独的查询,首先...

CREATE (a:Group {name: "a"})
     , (b:Group {name: "b"})
     , (c:Group {name: "c"})

...然后...

MATCH (r:Room)
RETURN r

您能帮我理解WITH 语句在做什么,以及为什么我创建单个查询是必不可少的吗?

【问题讨论】:

    标签: cypher with-statement


    【解决方案1】:

    所以基本上WITH 所做的就是让你chain together two different queries。这很有用,因为它有助于减少回答查询所需的计算量。

    你的查询有点奇怪:

    CREATE (a:Group {name: "a"})
         , (b:Group {name: "b"})
         , (c:Group {name: "c"})
    WITH a as a
    MATCH (r:Room)
    RETURN r
    

    这很奇怪,CREATE 和 MATCH 之间没有共同的变量。这里似乎更多的是您使用 WITH 将两个不相关的查询作为一个语句运行。没关系,但我认为 WITH 对您来说很尴尬,因为这不是它的预期用途。

    我在顶部发布的链接给出了您想要使用 WITH 的具体原因。 (限制搜索路径的分支,并在处理更多示例之前对结果进行排序)。

    对于您的特定查询,我倾向于将 CREATE 和 MATCH 分成两个不同的查询,因此 WITH 在这里看起来很奇怪也就不足为奇了。这是您可以运行的查询的另一个示例,它会更有意义:

    MATCH (g:Group)
    WHERE g.prop = "foo" /* some condition, only some groups */
    WITH g
    CREATE (g)-[:rel]->(another:Group)
    WHERE another.prop = "bar";
    

    因此,该查询将仅匹配某些组,然后创建与其他组的关系 - WITH 帮助清楚地表明正在创建的新关系仅限于在前面的步骤中匹配的那些内容。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-02-13
      • 1970-01-01
      • 2016-04-19
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多