2013-03-25 80 views
1

上更新的唯一索引值

独特= create_or_fail

创建一个新的节点时,因为它抛出一个4XX响应,如果重复的索引键/值已经存在的伟大工程的Neo4j Uniquness。

但是,如果节点已经存在和索引,需要更新的索引值,也没有办法(据我所知),以更新的值,如果新的值已经存在失败。这是因为如果新值已经存在,则添加节点到索引REST调用不会引发4xx响应。就我所见,索引的添加节点甚至不参与索引的唯一性。

一种解决方法是删除节点,并重新添加它,但是这并不容易,因为所有其他指标,在此节点上的关系将不得不重新创建。

另一种解决方案是将唯一参数添加到添加节点,以指数REST调用 http://docs.neo4j.org/chunked/1.9.M05/rest-api-indexes.html#rest-api-add-node-to-index

对此有什么其他的想法?

感谢

+0

通常唯一参数。什么是你的具体用例?您可以使用REST的API指数的看跌期权,如果非存在的语义和如果成功删除旧的值从指数这个节点。 – 2013-03-25 23:44:18

+0

,如果你有一个用户的电子邮件地址的唯一索引和用户更新他们的地址,例如。在这种情况下,你不会想创建,因为所有的现有关系的一个新用户节点将不得不重新创建。什么是好的是在插入到索引调用中具有相同的唯一性参数。这将在成功时返回200,在冲突时返回4xx。如果成功,批处理中的下一个命令将是从索引中删除。所以就你而言,这不会是一个更新。它是插入和删除索引值并在批处理事务中完成的。 – KanTube 2013-03-26 16:42:00

回答

0

我发生了这个问题,这里就是我想出了一个变通。

在更新过程中做作为一个REST批次如下:

  1. 删除所有节点的索引条目为所需的索引
  2. 创建所需的索引使用CreateOrFail,只是不使用新节点的正常的性只是用一个虚拟的财产,如DeleteMe=true
  3. 节点添加到所需的索引,因为如果走到这一步之前的步骤成功
  4. 更新节点的属性
  5. 使用暗号语句删除虚拟节点例如:未更新

    START n=node:index_name(index_key={value}) WHERE (n.DeleteMe!)=true DELETE n