使用 Python 将数据导入 Neo4j 需要时间

Import of data into Neo4j with Python takes time

有人使用 py2neo 和 Python 解析数据并将数据导入 Neo4j 吗?我目前正在尝试解析一个相对较大的 (18700r x 17c) .csv 文件并将其创建的节点和关系存储到 Neo 中。通过使用 py2neo,必须首先创建一个继承自 py2neo.data.Node 的模型,然后使用

for n in nodes:
    tx = graph.begin()
    tx.create(node)

for r in relations:
    tx = graph.begin()
    tx.create(r)

存储所有数据。 运行 time python ... 时,解析数据和存储大约需要 2.5 分钟(实时),而解析和存储大约需要一半时间。

另一种方法是创建一个大查询字符串,我设法做到了。完成后,可以 运行 graph.run(big_query_string) 完成相同的工作。现在解析需要大约 3 秒,存储需要 2.5 分钟。当我直接在浏览器中 运行 相同的查询字符串时,它花了 3 分钟。

我们两个人在同一个项目上。我在 Neo4j 上,另一个在 DGraph 上。它的核心是相同的解析代码,但存储在 DGraph 上最多需要 5 秒...

有人有这方面的经验吗?

更新 查询中正好有 115139 "CREATE" 条语句。

Py2neo 并未针对此类大型导入进行优化。您最好改用 Neo4j 的专用导入工具之一。

看起来您的代码正在逐个节点地迭代。如果您有大量数据要导入,使用 CSV 文件会更有效率。也许您当前的 CSV 可以直接使用?

我使用python代码创建、修改或直接使用CSV文件然后导入。我不是 python 大师,但是这将为您提供一种方法的示例:

首先,设置与 Neo4j 的连接

import Neo4jLib
from neo4j.v1 import GraphDatabase
from py2neo import Graph, Path, Node, Relationship  #http://py2neo.org/v3/
import re

importDir="C:\Users\david\.Neo4jDesktop\neo4jDatabases\database-49f9269f-5936-4b08-96b7-c2b3fa3006fa\installation-3.3.5\import\"

def Neo4jConnectionSetup( ):
    uri = "bolt://localhost:7687"
    driver = GraphDatabase.driver(uri, auth=("neo4j", "your password"))

上传:

def UploadWithPeriodicCommit(Q):
    try:
        uri = "bolt://localhost:7687"
        driver = GraphDatabase.driver(uri, auth=("neo4j", "your password"))
        with driver.session() as session:
            session.run(Q)

其中 q 是 cyper 查询,例如:

Neo4jLib.UploadWithPeriodicCommit("USING PERIODIC COMMIT 10000 
LOAD CSV WITH HEADERS FROM 'file:///vcf.csv' AS line FIELDTERMINATOR '|' 
merge (p:PosNode{Pos:toInteger(line.Pos)})")

您的 CSV 文件应位于所用数据库的导入目录中。您只指定其名称而不是完整路径。

这些上传和更新 运行 很快。