我目前正在使用py2neo与我的neo4j服务器连接。我想做的一件事是对标签强制执行唯一性约束(即在服务器端强制执行唯一的客户端生成的哈希)。为了举例,我有以下架构:
ON :Organization(uid) ONLINE (for uniqueness constraint)
由于我正在使用py2neo,我的正常节点创建序列通常需要:
这很好用。当我去创建一个重复的节点时,我:
上述步骤的问题是我现在在图表上有一个无标签的重复节点。相反,我想获得对现有节点的引用,因为这通常在关系创建的上下文中执行。为了实现这一点,我需要能够创建节点并在将其添加到图形之前将其标记为,这当前无法使用py2neo / REST API干净地完成。我无法使用批处理API,因为它失败并出现相同的错误(并且不返回现有节点的副本)。
解决方法是:
缺点是我正在执行额外的网络请求以及可避免的I / O.我正在寻找的Cypher模拟器是MERGE。好像我在这里有两三个选项:
遗留索引系统似乎也提供了更好的短期前景,因为我可以创建全文索引,似乎我也可以从中获得更好的性能。有什么想法/建议吗?
答案 0 :(得分:2)
我说使用MERGE,它也可以正确锁定并保证节点的唯一性。
唯一性检查是立即完成的,不确定同时执行操作的其他线程的更改的可见性。 MERGE采用索引锁定,并确保一次只有一个线程检查唯一性约束。
答案 1 :(得分:1)
py2neo(1.7)的下一个版本将能够更加流畅地处理这种情况。我目前正在构建将客户端实体操作(例如标签和属性)与客户端 - 服务器同步分开的功能。这意味着可以在应用程序中创建节点,然后在单个HTTP请求中将其推送到服务器。
代码看起来像:
from py2neo import Graph, Node
graph = Graph()
# Define a node client-side with a label and a property
node = Node("Person", name="Alice")
# Create the node on the server
# (this will bind the client-side node to a new server node)
graph.create(node)
# Make a few changes (client-side)
node.labels.add("Employee")
node.properties["employee_no"] = 42
# Push the changes to the bound server-side entity
node.push()
请注意,此处的代码只是一个示例,可能会在发布前更改!