Cypher:CREATE和MATCH之间需要WITH

时间:2015-08-22 13:32:03

标签: cypher with-statement

我想创建一组节点,并获取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语句正在做什么以及为什么在创建单个查询时它必不可少?

1 个答案:

答案 0 :(得分:0)

基本上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帮助清楚地表明正在创建的新关系仅限于那些在前面步骤中匹配的内容。

希望这有帮助。