使用 Py2Neo 加速 Neo4j 中节点之间边的创建

Paw*_*wan 5 neo4j graph-databases py2neo

我正在尝试在 Neo4j 中创建一个巨大的数据库,该数据库将拥有大约 200 万个节点和大约 400 万条边。通过批量创建节点(每批 1000 个节点),我能够加快节点创建过程。但是,当我尝试在这些节点之间创建边缘时,该过程会减慢,然后超时。最初,我认为它可能会很慢,因为我是根据节点名称进行合并的,但即使我使用 ids,它也会更慢 - 我已经手动创建了这些 id。下面我给出了数据和代码的片段,以便更好地理解问题 -

  1. Node.csv - 该文件包含有关节点的详细信息

    NodeName NodeType NodeId Sachin Person 1 UNO Organisation 2 Obama Person 3 Cricket Sports 4 Tennis Sports 5 USA Place 6 India Place 7

  2. Edges.csv - 该文件仅包含节点 ID 及其关系

    Node1Id Relationship Node2Id 1 Plays 4 3 PresidentOf 6 1 CitizenOf 7

创建节点的代码如下 -

from py2neo import Graph
graph = Graph()
statement =""
tx = graph.cypher.begin()
for i in range(len(Node)):
    statement = "Create(n{name:{A} ,label:{C}, id:{B}})"
    tx.append(statement,{"A": Node[i][0],"C":str(Node[i][1]), "B":str(Node[i][2])})
    if i % 1000 == 0:
        print str(i) + "Node Created"
        tx.commit()
        tx = self.graph.cypher.begin()
        statement =""
Run Code Online (Sandbox Code Playgroud)

上面的代码运行起来很神奇,5分钟内就完成了200万个节点的创建。创建边缘的代码如下 -

tx = graph.cypher.begin()
statement = ""
for i in range(len(Edges)):
    statement = "MATCH (a {id:{A}}), (b {id:{B}}) CREATE (a)-[:"+ Edges[i][1]+"]->(b)"
    tx.append(statement, {"A": Edges[i][0], "B": Edges[i][2]})
        if i % 1000 == 0:
            print str(i) + " Relationship Created"
            tx.commit()
            tx = graph.cypher.begin()
            statement = ""
Run Code Online (Sandbox Code Playgroud)

上面的代码可以很好地创建前 1000 个关系,但此后需要花费大量时间并且连接会超时。

我迫切需要解决这个问题,任何可以加快建立关系的过程的帮助都会非常有帮助。

请注意 - 我没有使用 Neo4j 的导入 csv 或 Neo4j shell 导入,因为它们假设节点之间的关系是固定的。而对我来说,关系各不相同,一次导入一个关系是不可行的,因为这意味着手动导入近 2000 次。

Mic*_*ger 5

您忘记为节点使用标签,然后在标签 + id 上创建约束。

create constraint on (o:Organization) assert o.id is unique;
create constraint on (p:Person) assert p.id is unique;

Create(n:Person {name:{A} ,id:{B}})
Create(n:Organization {name:{A} ,id:{B}})

match (p:Person {id:{p_Iid}), (o:Organization {id:{o_id}})
create (p)-[:WORKS_FOR]->(o);
Run Code Online (Sandbox Code Playgroud)