Cypher查询创建多个节点和关系

6
我正在尝试编写一个Cypher查询,以一次性创建多个节点和关系。Cypher中使用CREATE子句的文档说明,不可能在单个CREATE子句中创建不同类型的多个节点。
但是它提示我应该能够将其分解为多个CREATE。我读到的几个类似答案也指向了同样的解决方案。我已经尝试过这样做,但不断收到错误响应。
Error: If you create multiple elements, you can only create one of each.

这里是我尝试做的简要概述:
  1. 创建一个 item 节点。
  2. 创建多个 representation 节点。
  3. 创建一个将新创建的 item 节点和现有的 stack 节点之间建立联系的关系。
  4. 创建多个将新创建的 item 节点和新创建的 representation 节点之间建立联系的关系。
这是我目前正在使用的查询,它试图将 CREATE 过程的所有单独部分分解为单独的步骤。
START stack=node({stack})
CREATE (item {item}) 
CREATE (representations {representations})
CREATE (stack)-[:Item]->(item)
CREATE (item)-[:Representation]->(representations)
RETURN item, representations

我尝试了上述查询的几个变化,包括在查询开头创建itemrepresentation节点。

如果有可能,我真的不想采用多次数据库调用的方法,非常感谢任何建议。


你使用的是哪个API来执行Cypher查询语句,是嵌入式Java API还是一些REST驱动程序/客户端? - jjaderberg
@jjaderberg 我正在使用nodejs neo4j客户端,它是一个REST客户端。 - AshHeskes
1个回答

5

你的表示是一个列表吗?那么你只能将其作为单个创建语句。

我假设你的语法来自Neo4j 1.9。

不过你可以使用FOREACH

START stack=node({stack})
CREATE (item {item}) 
CREATE (stack)-[:Item]->(item)
FOREACH (r in {representations} : 
   CREATE (representation {r}), (item)-[:Representation]->(representation)
)
MATCH (item)-[:Representation]->(representations)
RETURN item, representations

你说得对,representations 是一个列表,我正在使用 Neo4j 1.9。我会尝试使用你的 FOREACH 解决方案并看看它的效果如何。只是出于好奇,如果你从列表中创建节点,为什么 CREATE 子句只能使用一次呢?此外,更新文档以明确说明这一点可能是值得的,因为目前它的读法是:“当你这样做时,你不能在同一个 CREATE 子句中创建其他任何东西。”我理解为可以使用多个 CREATE 子句。 - AshHeskes
@michael-hunger 我尝试了你的例子,但是一直出现语法错误 Error: ')' expected but 'C'。经过一些调整,发现问题出在 FOREACH 中第二个 CREATE 子句上。我试着修复它,但似乎没有任何作用。 - AshHeskes
你也可以在CREATE语句中使用逗号,我进行了编辑以反映这一点。 - Michael Hunger
我能够使用Neo4j 2.0和literal maps来运行一个等效的查询,而不是参数。你能更新你的问题,附上精确的查询、参数和完整的错误信息吗? - jjaderberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接