Neo4j 1.8.3中可能的索引错误?

时间:2014-01-03 18:48:09

标签: neo4j

环境: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的节点,然后在过去的某个时间删除了它。我们必须做更多的实验来证实这一点。

一个假设是:

  1. 过去创建了带有guidB的节点,并且Neo4j id = 1234。
  2. 然后将其删除,允许ID 1234在将来的某个时间重复使用。但是,guidB - > 1234记录仍然存在于索引中。
  3. 然后创建了带有guidA的节点,并给出了Neo4j id 1234。
  4. 然后将具有guidB的用户重新导入系统,通过GUID查找,并且由于索引中的原始记录仍然存在,因此找到了ID为1234的节点。
  5. 然后用guidB的用户属性覆盖id为n的节点的属性。
  6. 我想出这个的唯一原因是因为我知道删除关联节点时不会立即删除Lucene记录。同样,这种情况很少发生,密钥可能是删除节点。

    这是索引错误的可能性吗?

1 个答案:

答案 0 :(得分:2)

自动索引的这个问题在某些时候已得到修复。

只有在删除之后和创建新节点之前,才会在服务器重新启动时发生这种情况,这就是它很少发生的原因。

您可以执行的操作是查询新删除的GUID的索引,然后将其删除。为了安全起见,您还可以添加一个检查,将从索引返回的节点的GUID与搜索到的GUID进行比较。

通过重新设置guid属性,找一份工作可能是一个好主意,并检查索引/重新索引数据。

因为它是一个GUID,可能会使用带有GUID的唯一节点创建功能来创建节点?