我想在一个Cypher事务中创建多个neo4j节点和关系。我正在使用allows issuing multiple Cypher statements in one transaction。
的py2neo我以为我会为每个节点和我创建的关系添加一个声明:
tx.append('CREATE (n:Label { prop: val })')
tx.append('CREATE (m:Label { prop: val2 })')
现在我想在两个创建的节点之间创建一个关系:
tx.append('CREATE (n)-[:REL]->(m)')
这不能按预期工作。前两个节点之间没有建立任何关系,因为在最后一个语句的上下文中没有n
或m
(两个 new 节点之间存在新的关系 - 四个节点总共创建)
有解决方法吗?或者我应该在一个语句中将所有调用组合到CREATE(每个逻辑事务大约100,000个)?
这只是伤害了我的大脑思考这样的声明,因为我需要将所有内容存储在一个大的StringIO上,而且我失去了使用Cypher查询参数的能力 - 我需要将字典序列化为文本本身。< / p>
更新: 实际的图形布局比这更复杂。我有多种关系类型,每个节点至少连接两个其他节点,而一些节点连接到数百个节点。
答案 0 :(得分:1)
您不需要多个查询。您可以使用单个CREATE
来创建每个关系及其相关节点:
tx.append('CREATE (:Label { prop: val })-[:REL]->(:Label { prop: val2 })')
答案 1 :(得分:0)
做这样的事情:
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左右的批量进行此操作。