有没有办法确保使用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子句,它也可能涵盖你的场景.