使用事务性Neo4j REST API并行删除并创建节点时,未找到Neo.ClientError.Statement.EntityNotFound
当我在Neo4j数据库(v2.1.6,Ubuntu)中使用事务RESTAPI和自动提交模式并行删除并创建节点时,我会遇到如下错误使用事务性Neo4j REST API并行删除并创建节点时,未找到Neo.ClientError.Statement.EntityNotFound,neo4j,cypher,Neo4j,Cypher,当我在Neo4j数据库(v2.1.6,Ubuntu)中使用事务RESTAPI和自动提交模式并行删除并创建节点时,我会遇到如下错误 {"results":[],"errors":[{"code":"Neo.ClientError.Statement.EntityNotFound","message":"Node with id 35275"}]} 对于我运行查询的每个节点: curl -X POST -d @data http://localhost:7474/db/data/transacti
{"results":[],"errors":[{"code":"Neo.ClientError.Statement.EntityNotFound","message":"Node with id 35275"}]}
对于我运行查询的每个节点:
curl -X POST -d @data http://localhost:7474/db/data/transaction/commit -H "Content-Type:application/json; charset=UTF-8" -H Accept:application/json >out$i
谨此陈辞
{
"statements": [
{
"statement": "MATCH (k:Keyword {kwId: \"1\"}) DELETE k",
"parameters": {}
},
{
"statement": "CREATE (k:Keyword {props}) RETURN k",
"parameters": {
"props": {
"kwId": "1"
}
}
}
]
}
每个查询的kwId值都不同
当我按顺序执行查询时,一切都很好
当我并行运行查询时,我会得到一些查询的错误响应(20个查询中有5个错误响应)
这是Neo4j的问题还是我用错了
复制问题的脚本:
#!/bin/bash
NEO4J_URL=http://localhost:7474
TOTAL_QUERIES=20
# Create temp JSON files tmp1.json, tmp2.json, ....
for (( i=1; i<$TOTAL_QUERIES; i++ ))
do
JSON=tmp$i.json
cat > $JSON << END_OF_JSON
{
"statements": [
{
"statement": "MATCH (k:Keyword {kwId: \"$i\"}) DELETE k",
"parameters": {}
},
{
"statement": "CREATE (k:Keyword {props}) RETURN k",
"parameters": {
"props": {
"kwId": "$i"
}
}
}
]
}
END_OF_JSON
done
for (( i=1; i<$TOTAL_QUERIES; i++ ))
do
JSON=tmp$i.json
if [ "$1" = "sync" ]; then
curl --silent -X POST -d @$JSON $NEO4J_URL/db/data/transaction/commit -H "Content-Type:application/json; charset=UTF-8" -H Accept:application/json >out$i
else
curl --silent -X POST -d @$JSON $NEO4J_URL/db/data/transaction/commit -H "Content-Type:application/json; charset=UTF-8" -H Accept:application/json >out$i &
fi
done
wait
awk 'FNR==1{print ""}1' out* > result
grep "\"errors\":\[.*\]" result
rm out* tmp*.json result
不确定这是否有帮助,但我注意到一件随机的事情:您正在使用参数进行创建,而不是删除。我不知道这是否/为什么会导致竞争条件,但值得检查一下,做这两个查询似乎也有点奇怪。也许有一些机密的东西是你删掉的,但我认为你可以做到:
MATCH (k:Keyword) WHERE k.kwId IN ({kw_ids}) DELETE k WITH k.kwId AS kwId CREATE (:Keyword: {kwId: kwId})
在属性kwId上创建新索引似乎可以修复我案例中的错误
CREATE INDEX ON :Keyword(kwId)
谢谢你,布莱恩。我已选中删除参数。幸运的是,这无助于解决问题。您是对的。我错过了所有与简化问题无关的东西。在实际用例中,查询将删除具有现有关系的节点,并添加具有新属性和关系的新节点。由于遗留代码(我们正在从其他数据库迁移到Neo4j),我无法将所有语句组合到一个查询中。节点是单独处理的,节点数量相当大,约为100万个。不管怎样,谢谢布赖恩给我时间和建议。我将尝试探索他们的代码,以了解发生了什么。
MATCH (k:Keyword) WHERE k.kwId IN ({kw_ids}) DELETE k WITH k.kwId AS kwId CREATE (:Keyword: {kwId: kwId})
CREATE INDEX ON :Keyword(kwId)