使用 neo4jclient 确保唯一节点

Posted

技术标签:

【中文标题】使用 neo4jclient 确保唯一节点【英文标题】:Ensure unique nodes with neo4jclient 【发布时间】:2013-05-10 05:56:36 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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")

如果WithWhere 语句更简洁一些会很好,但它现在可以使用。

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

【讨论】:

谢谢,泰瑟姆。在我的场景中,我不知道创建节点时节点是唯一的,所以我必须先检查。我尝试了 CREATE UNIQUE,但它确实需要您拥有节点和连接。就我而言,我必须先创建一个唯一节点。这似乎是一种 hack,因为我通过网络发送原始 Cypher,你强烈建议不要这样做。 :-) 我建议不要使用 ExecuteRawCypherQuery。使用 IGraphClient.Cypher 来处理,在哪里和创建都很好。 这样做有什么好处?无论如何,似乎几乎所有参数都是原始文本字符串。通过在一个文本字符串上传递 4-5 个文本字符串可以获得什么? 这主要是关于正确使用参数,无论是为了安全还是性能。随着时间的推移,我们也在努力改进 Where 方法。

以上是关于使用 neo4jclient 确保唯一节点的主要内容,如果未能解决你的问题,请参考以下文章

在 f# 中使用 Neo4jClient 创建带标签的节点

如何在 Neo4j v2 中使用 Neo4jClient 创建节点?

Neo4jClient - 返回属于节点的标签

Neo4jClient:对 CRUD API 的质疑

Neo4j 可以在节点中存储字典吗?

Neo4jClient "CASE WHEN" 连同返回