环境:Neo4j社区1.8,2,Node.js 0.10.22,Debian挤压,JDK 1.6.x
我要描述的问题是非常虚假的,我们无法弄清楚代码中可能导致它的原因。所以这是在黑暗中拍摄的......
我们的所有节点在创建时都会通过TransactionEventHandler插件分配一个GUID属性,除非它们具有现有的GUID属性。我们为此GUID属性启用了自动索引。这似乎工作正常。我们的大多数查询都是基于GUID的。也就是说,我们经常通过GUID查找节点作为查询的全部或部分。我们已经注意到,使用guidA的现有节点很少被刚刚创建的带有guidB的节点的属性覆盖。请注意,在这种情况下,GUID实际上是由外部系统生成的(我们将用户从一个系统导入另一个系统)。我们可以看到这种情况发生,因为我们为每个GUID保留了版本历史记录。我们可以看到当时出现这个问题guidA和guidB共享相同的Neo4j节点id。它也可能是已经创建了一个带有guidB的节点,然后在过去的某个时间删除了它。我们必须做更多的实验来证实这一点。
一个假设是:
我想出这个的唯一原因是因为我知道删除关联节点时不会立即删除Lucene记录。同样,这种情况很少发生,密钥可能是删除节点。
这是索引错误的可能性吗?
答案 0 :(得分:2)
自动索引的这个问题在某些时候已得到修复。
只有在删除之后和创建新节点之前,才会在服务器重新启动时发生这种情况,这就是它很少发生的原因。
您可以执行的操作是查询新删除的GUID的索引,然后将其删除。为了安全起见,您还可以添加一个检查,将从索引返回的节点的GUID与搜索到的GUID进行比较。
通过重新设置guid属性,找一份工作可能是一个好主意,并检查索引/重新索引数据。
因为它是一个GUID,可能会使用带有GUID的唯一节点创建功能来创建节点?