使用neo4jclient确保唯一节点

时间:2013-05-10 05:56:36

标签: neo4jclient

使用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"

但这显然是一个黑客攻击。还有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

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条款也可能涵盖您的情况。