使用py2neo上传数据的最佳方法

伊万·谢尔坚科(Ivan Sergienko)

我已经尝试了使用py2neo上传中等大小的数据集的方法。以我为例,每天大约需要加载80 K个节点和400 K边缘。我想分享我的经验,并询问社区是否还有我没有遇到过的更好的方法。

A. py2neo的“本机”命令。

使用创建节点,graph.merge_one()使用设置属性push()我已经非常快地消除了这个问题,因为它非常缓慢,甚至在几分钟内都不会超过1万条记录。毫不奇怪,py2neo的文档和此处的一些帖子推荐使用Cypher。

B.无需分区的密码

使用py2neo.cypher.CypherTransaction append()中环和commit()底。

# query sent to MSSQL. Returns ~ 80K records
result = engine.execute(query) 
statement = "MERGE (e:Entity {myid: {ID}}) SET e.p = 1"
# begin new Cypher transaction
tx = neoGraph.cypher.begin()
for row in result:
    tx.append(statement, {"ID": row.id_field})
tx.commit()

这超时并导致Neo4j服务器崩溃。我知道问题在于所有80 K Cypher语句都试图一次执行。

C.具有分区和一次提交的密码

我使用计数器和process()命令来一次运行1000条语句。

# query sent to MSSQL. Returns ~ 80K records
result = engine.execute(query) 
statement = "MERGE (e:Entity {myid: {ID}}) SET e.p = 1"
counter = 0
tx = neoGraph.cypher.begin()
for row in result:
    counter += 1
    tx.append(statement, {"ID": row.id_field})
    if (counter == 1000):
        tx.process()    # process 1000 statements
        counter = 0
tx.commit()

它在开始时运行很快,但是在处理1000个事务时变慢了。最终,它在堆栈溢出中超时。这是令人惊讶的,因为我希望process()每次都重置堆栈。

D.带有分区的密码并为每个分区提交

这是唯一运行良好的版本。难道commit()1000个交易的每一个分区,并重新开始一个新的事务begin()

# query sent to MSSQL. Returns ~ 80K records
result = engine.execute(query) 
statement = "MERGE (e:Entity {myid: {ID}}) SET e.p = 1"
counter = 0
tx = neoGraph.cypher.begin()
for row in result:
    counter += 1
    tx.append(statement, {"ID": row.id_field})
    if (counter == 1000):
        tx.commit()                   # commit 1000 statements
        tx = neoGraph.cypher.begin()  # reopen transaction
        counter = 0
tx.commit()

这运行得很好。

任何意见?

威廉·里昂

正如您通过反复试验发现的那样,单个事务的操作不超过约10K-50K时,其性能最佳。D中描述的方法最有效,因为您每1000条语句提交一次事务。您可能可以安全地增加该批次的大小。

您可能想尝试的另一种方法是将值数组作为参数传递,并使用Cypher的UNWIND命令对其进行迭代。例如:

WITH {id_array} AS ids // something like [1,2,3,4,5,6]
UNWIND ids AS ident
MERGE (e:Entity {myid: ident})
SET e.p = 1

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用py2neo将数据从XML加载到neo4j

来自分类Dev

使用py2neo将文本数据插入Neo4j

来自分类Dev

使用py2neo从Neo4j获取大量节点的最快方法

来自分类Dev

py2neo从Cypher查询返回数据时出错

来自分类Dev

如何使用py2neo批量添加标签

来自分类Dev

使用Py2neo插入属性值

来自分类Dev

py2neo中的密码查询

来自分类Dev

py2neo的WriteBatch操作失败

来自分类Dev

在py2neo中批处理

来自分类Dev

Py2neo搜索错误

来自分类Dev

连接py2neo时出错

来自分类Dev

py2neo和flask查询

来自分类Dev

无法使用py2neo删除具有关系的neo4j节点

来自分类Dev

使用py2neo将JSON导入NEO4J

来自分类Dev

使用py2neo将python连接到neo4j时出错

来自分类Dev

在neo4j和py2neo中使用索引

来自分类Dev

使用Py2Neo加速Neo4j中Node之间的边缘创建

来自分类Dev

如何使用Py2Neo在Linux上修复IncompleteRead错误

来自分类Dev

使用py2neo和flask获取所有与我的输入节点连接的节点

来自分类Dev

如何使用Py2Neo修复Linux上的IncompleteRead错误

来自分类Dev

如何使用py2neo或cypher查询语言计算所有关系属性

来自分类Dev

py2neo 2.0:错误:httpstream :!SocketError:超时

来自分类Dev

可以在py2neo的标签上创建索引吗?

来自分类Dev

py2neo引发ConstraintViolation错误,shell没有

来自分类Dev

如何用py2neo声明唯一的约束

来自分类Dev

(py2neo)如何检查关系是否存在?

来自分类Dev

Py2Neo:graph.cypher.execute()

来自分类Dev

Py2neo:查找关系并返回节点

来自分类Dev

将py2neo查询输出为JSON