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

时间:2015-12-09 20:03:14

标签: neo4j cypher py2neo

我想在一个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)')

这不能按预期工作。前两个节点之间没有建立任何关系,因为在最后一个语句的上下文中没有nm(两个 new 节点之间存在新的关系 - 四个节点总共创建)

有解决方法吗?或者我应该在一个语句中将所有调用组合到CREATE(每个逻辑事务大约100,000个)?

这只是伤害了我的大脑思考这样的声明,因为我需要将所有内容存储在一个大的StringIO上,而且我失去了使用Cypher查询参数的能力 - 我需要将字典序列化为文本本身。< / p>

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

2 个答案:

答案 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左右的批量进行此操作。