我应该使用哪种索引系统?

时间:2014-06-02 16:21:58

标签: indexing neo4j py2neo

我目前正在使用py2neo与我的neo4j服务器连接。我想做的一件事是对标签强制执行唯一性约束(即在服务器端强制执行唯一的客户端生成的哈希)。为了举例,我有以下架构:

ON :Organization(uid)    ONLINE (for uniqueness constraint)

由于我正在使用py2neo,我的正常节点创建序列通常需要:

  1. 根据组织的属性生成UID哈希
  2. 将其添加到数据库
  3. 将“Organization”标签添加到add statement
  4. 返回的水合节点

    这很好用。当我去创建一个重复的节点时,我:

    1. 根据组织的属性生成UID哈希
    2. 将其添加到数据库
    3. 尝试添加由于唯一性约束而失败的“组织”标签。
    4. 上述步骤的问题是我现在在图表上有一个无标签的重复节点。相反,我想获得对现有节点的引用,因为这通常在关系创建的上下文中执行。为了实现这一点,我需要能够创建节点并在将其添加到图形之前将其标记为,这当前无法使用py2neo / REST API干净地完成。我无法使用批处理API,因为它失败并出现相同的错误(并且不返回现有节点的副本)。

      解决方法是:

      1. 根据组织的属性生成UID哈希
      2. 在数据库中查询具有该哈希值的节点
      3. 如果存在,请使用它,否则将节点添加到数据库,然后将“Organization”标签添加到节点。
      4. 缺点是我正在执行额外的网络请求以及可避免的I / O.我正在寻找的Cypher模拟器是MERGE。好像我在这里有两三个选项:

        1. 我没有使用标准图形创建操作,而是将节点摘要转换为Cypher MERGE语句并执行该操作。
        2. 回退到提供get_or_create方法的“遗留”索引系统。
        3. 遗留索引系统似乎也提供了更好的短期前景,因为我可以创建全文索引,似乎我也可以从中获得更好的性能。有什么想法/建议吗?

2 个答案:

答案 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()

请注意,此处的代码只是一个示例,可能会在发布前更改!