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

这个链接 transactions 展示了如何使用 java 和事务来做到这一点,但我在 neo4jclient 中没有看到任何事务支持。我能够使用像这样的显式 Cypher 字符串查询来做到这一点:

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

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

最佳答案

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

但这并没有给你带来独特性...

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

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

你好像在走B路线。

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

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

您可以通过 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")

一些 WithWhere 语句如果更简洁的话会很好,但现在它是功能性的。

还有 Cypher 的 CREATE UNIQUE 子句,它也可能涵盖您的场景。

关于neo4jclient - 使用 neo4jclient 确保唯一节点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16476058/

10-13 06:38