我想创建一组节点,并获得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
..。或者如果我把它分成两个独立的查询,首先...
CREATE (a:Group {name: "a"})
, (b:Group {name: "b"})
, (c:Group {name: "c"})
..。然后..。
MATCH (r:Room)
RETURN r
您能帮助我理解WITH
语句的作用吗?为什么在创建一个查询时它是必不可少的?
发布于 2015-08-23 00:45:14
所以基本上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对您来说很尴尬,因为这不是它的预期使用方式。
我在顶部发布的链接给出了您想要使用的具体原因。(限制搜索路径的分支,并在处理更多结果之前对结果进行排序)。
对于您的特定查询,我倾向于将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 help清楚地表明,正在创建的新关系仅限于在前面步骤中匹配的那些内容。
希望这能有所帮助。
https://stackoverflow.com/questions/32156721
复制相似问题