Neo4j 在多个Cypher语句中创建多个节点和关系

Neo4j 在多个Cypher语句中创建多个节点和关系,neo4j,cypher,py2neo,Neo4j,Cypher,Py2neo,我想在一个Cypher事务中创建多个neo4j节点和关系。我用的是py2neo 我想为我创建的每个节点和关系添加一条语句: tx.append('CREATE (n:Label { prop: val })') tx.append('CREATE (m:Label { prop: val2 })') 现在,我想在两个创建的节点之间创建一个关系: tx.append('CREATE (n)-[:REL]->(m)') tx.append('CREATE (:Label { prop: v

我想在一个Cypher事务中创建多个neo4j节点和关系。我用的是py2neo

我想为我创建的每个节点和关系添加一条语句:

tx.append('CREATE (n:Label { prop: val })')
tx.append('CREATE (m:Label { prop: val2 })')
现在,我想在两个创建的节点之间创建一个关系:

tx.append('CREATE (n)-[:REL]->(m)')
tx.append('CREATE (:Label { prop: val })-[:REL]->(:Label { prop: val2 })')
这不符合预期。前两个节点之间没有创建关系,因为在最后一条语句的上下文中没有
n
m
(两个新节点之间有一个新关系-总共创建了四个节点)

有办法解决这个问题吗?或者我应该将所有调用合并到一个语句中创建(每个逻辑事务大约100000个)

想到这样一个语句会伤到我的大脑,因为我需要将所有内容都存储在一个大的StringIO上,并且我失去了使用Cypher查询参数的能力——我需要将字典序列化为文本

更新:
实际的图形布局要比这复杂得多。我有多种关系类型,每个节点至少连接到两个其他节点,而有些节点连接到数百个节点。

您不需要多个查询。您可以使用单个
CREATE
创建每个关系及其相关节点:

tx.append('CREATE (n)-[:REL]->(m)')
tx.append('CREATE (:Label { prop: val })-[:REL]->(:Label { prop: val2 })')

这样做:

rels = [(1,2), (3,4), (5,6)]

query = """
CREATE (n:Label {prop: {val1} }),
       (m:Label {prop: {val2} }),
       (n)-[:REL]->(m)
"""

tx = graph.cypher.begin()

for val1, val2 in rels:
    tx.append(query, val1=val1, val2=val2)

tx.commit()

如果你的数据足够大,请考虑5000个左右的批次。

我给出的例子过于简化了。我在节点之间有很多关系,我不能用一个create语句创建它们。它不会失败,它只会创建两个没有标签或属性的节点。这一关系仍将被创造。好的,是的,这并不像预期的那样工作……这是因为标识符只在查询范围内是相关的:是的,我知道,我希望有一个方法可以绕过这个问题而不需要创建一个巨大的查询。如果你正在考虑使用大量的数据导入。有关示例,请参见。另请参见使用py2neo
WriteBatch