【问题标题】:Import of data into Neo4j with Python takes time使用 Python 将数据导入 Neo4j 需要时间
【发布时间】:2018-06-23 01:35:19
【问题描述】:

有人使用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 多分钟。

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

有人有这方面的经验吗?

更新 查询中恰好有 115139 条“CREATE”语句。

【问题讨论】:

    标签: neo4j py2neo


    【解决方案1】:

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

    【讨论】:

    • 是的,这是正确的。接缝就像他们拥有的唯一合理的导入工具是用于 .csv 文件的。所以我所做的是将单个csv文件中的数据解析为两个节点和relationship.csv。现在,对于 1823 个节点、122600 个关系和 3645 个属性的数据集,这一切都在 10 秒内完成。我很高兴
    【解决方案2】:

    看起来您的代码正在逐节点迭代。如果您有大量数据要导入,使用 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 应该放在正在使用的数据库的 Import 目录中。您只指定其名称而不是完整路径。

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

    【讨论】:

    • 感谢您的回复。这可能也会起作用。正如我在上一个回复的评论中提到的那样,我的解决方案是将其导出到两个新的 .csv 文件,其中一个是节点,另一个是关系,然后使用 ./bin/neo4j-admin import --nodes=nodes.csv --relationships=relations.csv 将其导入 Neo。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多