使用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")
一些
With
和 Where
语句如果更简洁的话会很好,但现在它是功能性的。还有 Cypher 的
CREATE UNIQUE
子句,它也可能涵盖您的场景。关于neo4jclient - 使用 neo4jclient 确保唯一节点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16476058/