4

使用 neo4jclient 创建节点时,有没有办法确保唯一性?

此链接事务显示了如何使用 java 和事务来执行此操作,但我在 neo4jclient 中看不到任何事务支持。我能够使用类似这样的显式 Cypher 字符串查询来做到这一点:

"start n=node:node_auto_index(name={id}) 
 with count(*) as c 
 where c=0 
 create x={name:{id}} 
 return c"

但这显然是一个 hack。有没有更好的办法?

4

1 回答 1

2

Neo4j 2.0 和更高版本的 Neo4jClient 将提供事务支持。此问题正在跟踪工作:https ://bitbucket.org/Readify/neo4jclient/issue/91/support-cypher-transactions-integrated

但是,这并没有给您带来独特性...

Neo4j 没有唯一索引可以自动执行这个想法。(我希望我们将来会在 Neo4j 2.0 标签中看到这一点,但现在还没有。)

您需要 a) 知道您正在创建的内容是独一无二的,或者 b) 首先检查。

你似乎走的是B路线。

事务允许您在单个事务操作中进行检查然后创建,但仍然可以通过网络进行多次调用。

您写出的 Cypher 文本实际上是首选:您在单个语句中进行检查并创建。我很想知道为什么你认为这是一个 hack。

您可以通过 Neo4jClient 执行此语句,例如:

var id = 123;
graphClient.Cypher
    .Start(new { n = Node.ByIndexLookup("node_auto_index", "name", id)})
    .With("count(*) as c")
    .Where("c=0")
    .Create("x={0}", new MyType { name = id })
    .Return<Node<MyType>>("c")

一些WithandWhere语句如果它们更干净的话会很好,但它现在可以使用。

还有 Cypher 的CREATE UNIQUE条款也可能涵盖您的情况。

于 2013-05-12T23:42:21.373 回答