C# 在一个事务中将2M节点/关系插入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})

我最近一直在玩neo4j/cypher来将对象存储到其中。 我正在使用netcore和neo4j.Driver v1.5

在我需要更高的性能之前,一切都很好,因为我需要在运行时存储数百万个节点/关系

在花了一些时间研究其他一些问题和文章之后,我决定以“天真”的方式重构我在调用neo4j时所拥有的东西。(每个创建一个请求)

我现在通过以下方式使用查询参数来减少查询数量:

用于节点创建

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
我还将每隔几千个(在我的例子中是10k)节点/关系提交一次,以便neo4j能够处理它,并确保包括这些额外的标签和属性

操作结束时:

  • 成功后,我将删除应用于节点和关系的额外标签和属性

    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