【问题标题】:py2neo: depending batch insertionpy2neo:取决于批量插入
【发布时间】:2013-09-07 18:43:53
【问题描述】:

我使用 py2neo (v 1.9.2) 将数据写入 neo4j 数据库。

batch = neo4j.WriteBatch(graph_db)
current_relationship_index = graph_db.get_or_create_index(neo4j.Relationship, "Current_Relationship")
touched_relationship_index = graph_db.get_or_create_index(neo4j.Relationship, "Touched_Relationship")
get_rel = current_relationship_index.get(some_key1, some_value1)
if len(get_rel) == 1:
    batch.add_indexed_relationship(touched_relationship_index, some_key2, some_value2, get_rel[0])
elif len(get_rel) == 0:
    created_rel = current_relationship_index.create(some_key3, some_value3, (my_start_node, "KNOWS", my_end_node))
    batch.add_indexed_relationship(touched_relationship_index, some_key4, "touched", created_rel)
batch.submit()

有没有办法用批处理命令替换 current_relationship_index.get(..) 和 current_relationship_index.create(...) ?我知道有一个,但问题是,我需要根据这些命令的返回来采取行动。由于性能原因,我希望将所有语句放在一个批次中。

我读到索引关系并不常见,但我这样做的原因如下:我需要每天解析一些(文本)文件,然后需要检查是否有任何关系在前一天发生了变化,即如果文本文件中不再存在关系,我想用 neo4j 中的“替换”属性标记它。因此,我将所有“接触”关系添加到适当的索引中,因此我知道这些并没有改变。所有不在touched_relationship_index中的关系显然不再存在,所以我可以标记它们。

我想不出更简单的方法,尽管我确信 py2neo 提供了一个。

编辑:考虑到奈杰尔的评论,我尝试了这个:

my_rel = batch.get_or_create_indexed_relationship(current_relationship_index, some_key, some_value, my_start_node, my_type, my_end_node)
batch.add_indexed_relationship(touched_relationship_index, some_key2, some_value2, my_rel)
batch.submit()

这显然不起作用,因为我不能在批处理中引用“my_rel”。我该如何解决这个问题?用“0”表示上一个批处理语句的结果?但是考虑到整个事情应该循环运行,所以数字不是固定的。也许使用一些变量“batch_counter”,它指的是当前的批处理语句,并且每当将语句添加到批处理时总是递增??

【问题讨论】:

    标签: python neo4j py2neo


    【解决方案1】:

    看看WriteBatch.get_or_create_indexed_relationship。这可以根据当前是否存在并以原子方式操作来有条件地创建一种关系。文档链接如下:

    http://book.py2neo.org/en/latest/batches/#py2neo.neo4j.WriteBatch.get_or_create_indexed_relationship

    py2neo 中有一些类似的唯一性管理工具,我最近在博客中提到了 here,您可能想了解一下。

    【讨论】:

    • 感谢 Nigel,我非常感谢您的工作。但是,我仍然无法弄清楚如何做到这一点。我的方法是这样的: my_rel = batch_add_relation.get_or_create_indexed_relationship(current_relationship_index, some_key, some_value, my_start_node, my_type, my_end_node) batch_add_relation.add_indexed_relationship(touched_relationship_index, some_key2, some_value2, my_rel) 这显然行不通,因为我不能引用“my_rel “在批次中。我该如何解决这个问题?用“0”表示上一个批处理语句的结果?但是考虑到这是循环运行的,所以数字不是固定的
    • 查看我的原始帖子的编辑以获得更好的概览
    • 1.5 中的许多批处理方法允许对该批处理中的其他项目进行数字引用,因此0 指的是第一个批处理请求的结果。在 1.6 版本中,返回值可用于相同目的 (book.py2neo.org/en/release-1.6.0/batches/…)
    • 听起来不错,1.6(稳定版)什么时候发布?
    • 它现在正在测试中(test.py2neo.org如果你想看看它是否适合你)并将于 2013 年 10 月 1 日发布。
    猜你喜欢
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多