我正在尝试解决在Neo4j中插入相关节点时出现的问题。使用org.springframework.data.neo4j.repository.GraphRepository的标准save方法,由多个线程插入节点。
有时,在获取相关节点以便定义关系时插入失败。异常消息是这样的:org.neo4j.graphdb.NotFoundException:' __ type __'在http://neo4j:7474/db/data/relationship/105550。
从curl调用此URL会返回一个JSON对象,该对象似乎正确定义了__type__,这表明异常是由插入线程之间的争用引起的。
发起对存储库的调用的方法是注释@ Neo4jTransactional。 @ Neo4jTransactional保证什么原子性和事务隔离?我应该如何将它用于多线程插入?
更新: 我现在能够在调试器中看到这种情况。代码试图在此关系的一端获取节点及其所有关系。它会抛出异常,因为缺少类型属性。这是最初返回的JSON。
{
"extensions" : { },
"start" : "http://localhost:7474/db/data/node/617",
"property" : "http://localhost:7474/db/data/relationship/533/properties/{key}",
"self" : "http://localhost:7474/db/data/relationship/533",
"properties" : "http://localhost:7474/db/data/relationship/533/properties",
"type" : "CONTAINS",
"end" : "http://localhost:7474/db/data/node/650",
"metadata" : {
"id" : 533,
"type" : "CONTAINS"
},
"data" : { }
}
几秒钟后,同一个REST调用返回此JSON:
{
"extensions" : { },
"start" : "http://localhost:7474/db/data/node/617",
"property" : "http://localhost:7474/db/data/relationship/533/properties/{key}",
"self" : "http://localhost:7474/db/data/relationship/533",
"properties" : "http://localhost:7474/db/data/relationship/533/properties",
"type" : "CONTAINS",
"end" : "http://localhost:7474/db/data/node/650",
"metadata" : {
"id" : 533,
"type" : "CONTAINS"
},
"data" : {
"__type__" : "ProductRelationship"
}
}
我无法理解为什么在插入关系和指定类型之间会有这么长的延迟。为什么一下子不发生这一切?