使用事务性Neo4j REST API并行删除并创建节点时,未找到Neo.ClientError.Statement.EntityNotFound

使用事务性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

当我在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/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)