neo4j并发问题 - 删除和匹配

时间:2015-12-10 18:43:03

标签: neo4j cypher

我有一个程序来构建图形。我有一个收割机,删除旧图。

有时,构建图形时使用的查询返回的节点集与要收集的节点集重叠。这给了我一个虚假的"EntityNotFound: Node with id xxxxxx"错误。

我说它是虚假的,因为现实是我们没有删除我们正在添加的节点 - 它们位于不同的图形上。

然而,加载器的MATCH有两部分:

MATCH(n: MYNODE {indexed-var:"ddd", version:"xxx"} ...

确实,“ddd”索引的某些n可能会被删除,但我添加的节点n的特定版本将始终具有“安全”版本号。但是,EXPLAIN清楚地表明我正在吸吮多个MYNODE节点,然后过滤到特定节点。我猜测删除程序在加载程序获取之后删除了一个MYNODE节点,但是在它被过滤之前。

加载器和删除器都在运行事务,因此它不是直接的事情 - 失败发生在提交上。

我可以使用_LOCK_来阻止读取和删除同时在同一节点上执行操作吗?其他想法?

1 个答案:

答案 0 :(得分:1)

一种解决方案是:

  1. 添加到MYNODE另一个属性(我们称之为id),其值是一个连接索引和版本的字符串,用分隔符分隔(假设它是“|”)。
  2. :MYNODE(id)上创建索引。
  3. 将您的MATCH子句更改为:

    MATCH(n: MYNODE {id:"ddd|xxx"} ...
    
  4. 使用索引可以使Cypher立即获得所需的节点,从而无需遍历所有MYNODE个节点并过滤掉不需要的节点(其中一些可能不再存在)。这种方法具有更快的附加好处。