C# 在一个事务中将2M节点/关系插入Neo4J永远不会成功
我最近一直在玩neo4j/cypher来将对象存储到其中。 我正在使用netcore和neo4j.Driver v1.5 在我需要更高的性能之前,一切都很好,因为我需要在运行时存储数百万个节点/关系 在花了一些时间研究其他一些问题和文章之后,我决定以“天真”的方式重构我在调用neo4j时所拥有的东西。(每个创建一个请求) 我现在通过以下方式使用查询参数来减少查询数量: 用于节点创建C# 在一个事务中将2M节点/关系插入Neo4J永远不会成功,c#,docker,neo4j,.net-core,cypher,C#,Docker,Neo4j,.net Core,Cypher,我最近一直在玩neo4j/cypher来将对象存储到其中。 我正在使用netcore和neo4j.Driver v1.5 在我需要更高的性能之前,一切都很好,因为我需要在运行时存储数百万个节点/关系 在花了一些时间研究其他一些问题和文章之后,我决定以“天真”的方式重构我在调用neo4j时所拥有的东西。(每个创建一个请求) 我现在通过以下方式使用查询参数来减少查询数量: 用于节点创建 MERGE (model:EngineeringModel {id: $engineeringModelId})
MERGE (model:EngineeringModel {id: $engineeringModelId})
WITH model
UNWIND $nodes AS node
CREATE (thing:Label1:Label2:LabelN)<-[:Model]-(model)
SET thing = node
在哪里,,
$engineeringModelId是一个字符串,
$relationships是包含源节点及其所有目标/关系类型的对象数组
我使用事务功能在5分钟内成功地保存了大约100万个节点/关系,并将请求拆分为多达20000个对象。(拆分在C#代码中完成)
这样做的问题是,在每20000个节点/关系执行一次提交的意义上,它不是“事务安全的”
通过使用4.3.2.3中所述的显式事务
我无法在合理的时间内执行提交(我从未设法保存)
以下是我的docker容器的配置:
NEO4J_dbms_memory_pagecache_size=2G
NEO4J_dbms_memory_heap_maxSize=2G
NEO4J_dbms_memory_heap_initial__size=2G
有人知道如何使这个显式事务正常工作吗
非常感谢大家的阅读 因此,经过一些调查和neo4j社区对neo4j slack的一些输入,似乎不可能在我的neo4j版本(V3.2.5)中直接实现我想要的.netcore驱动程序v1.5,并且需要一个“手动”处理事务的解决方案 解决方法基本上如下所示:
- 为当前事务中要创建的所有节点添加一个额外的TMP标签,该标签具有根据POST请求生成的transactionId属性
- 在使用相同事务id的事务期间创建的关系上添加额外属性transactionId
- 成功后,我将删除应用于节点和关系的额外标签和属性
MATCH (tmpNode:TMP { transactionId: $transactionId }) USING INDEX tmpNode:TMP(transactionId) REMOVE tmpNode:TMP REMOVE tmpNode.transactionId MATCH ()-[r { transactionId: $transactionId }]->() REMOVE r.transactionId
- 如果出现问题,我将删除创建的所有节点和关系
MATCH (tmpNode:TMP { transactionId: $transactionId }) USING INDEX tmpNode:TMP(transactionId) DETACH DELETE tmpNode MATCH ()-[tmpRel { transactionId: $transactionId }]->() DELETE tmpRel
在我的本地机器上,我设法在大约10分钟内运行了这个程序,这仍然不是很好,但至少是可行的。谢谢分享
NEO4J_dbms_memory_pagecache_size=2G
NEO4J_dbms_memory_heap_maxSize=2G
NEO4J_dbms_memory_heap_initial__size=2G
MATCH (tmpNode:TMP { transactionId: $transactionId })
USING INDEX tmpNode:TMP(transactionId)
REMOVE tmpNode:TMP
REMOVE tmpNode.transactionId
MATCH ()-[r { transactionId: $transactionId }]->()
REMOVE r.transactionId
MATCH (tmpNode:TMP { transactionId: $transactionId })
USING INDEX tmpNode:TMP(transactionId)
DETACH DELETE tmpNode
MATCH ()-[tmpRel { transactionId: $transactionId }]->()
DELETE tmpRel