我有一个程序来构建图形。我有一个收割机,删除旧图。
有时,构建图形时使用的查询返回的节点集与要收集的节点集重叠。这给了我一个虚假的"EntityNotFound: Node with id xxxxxx"
错误。
我说它是虚假的,因为现实是我们没有删除我们正在添加的节点 - 它们位于不同的图形上。
然而,加载器的MATCH有两部分:
MATCH(n: MYNODE {indexed-var:"ddd", version:"xxx"} ...
确实,“ddd”索引的某些n
可能会被删除,但我添加的节点n
的特定版本将始终具有“安全”版本号。但是,EXPLAIN
清楚地表明我正在吸吮多个MYNODE节点,然后过滤到特定节点。我猜测删除程序在加载程序获取之后删除了一个MYNODE节点,但是在它被过滤之前。
加载器和删除器都在运行事务,因此它不是直接的事情 - 失败发生在提交上。
我可以使用_LOCK_
来阻止读取和删除同时在同一节点上执行操作吗?其他想法?
答案 0 :(得分:1)
一种解决方案是:
MYNODE
另一个属性(我们称之为id
),其值是一个连接索引和版本的字符串,用分隔符分隔(假设它是“|”)。:MYNODE(id)
上创建索引。将您的MATCH
子句更改为:
MATCH(n: MYNODE {id:"ddd|xxx"} ...
使用索引可以使Cypher立即获得所需的节点,从而无需遍历所有MYNODE
个节点并过滤掉不需要的节点(其中一些可能不再存在)。这种方法具有更快的附加好处。