【问题标题】:Handling a RecordListList from a py2neo transaction process() call处理来自 py2neo 事务 process() 调用的 RecordListList
【发布时间】:2015-06-24 16:09:02
【问题描述】:

我正在使用

处理 Cypher 语句
result = my_cypher.my_transaction.process()

我的问题是我不知道如何优雅地得到结果。我偶然发现 process() 返回一个 RecordListList 但我不知道如何处理它,除了迭代它。这让我很恼火,因为在我的这部分代码中,我一次处理一个语句,并不需要迭代任何东西。 (不过,我仍然在单笔交易中。)

这就是我现在这样做的原因,它正在燃烧我的灵魂:

result = cypher.tx.process()
for r in result:
    for x in r:
        node_id = x['node_id']

但是rx 将永远只有一行。如果我能直接得到结果,我会更开心:

node_id = result.one().one()['node_id']

编辑 1

我使用 ipython 来显示 process() 上可用的方法列表。其中之一是pop()。现在我有这个可憎的:

 result = cypher.process()
 one_row = result.pop()
 tmp = one_row[0]['node_id']

更好,但仍然丑陋。

编辑 2

显然,RecordList 中有一个魔法可以从所述记录集中提取第一行。这是一个名为one 的属性。很奇怪,它不是一种方法。

 result = cypher.process()
 one_row = result.pop()
 node_id = one_row.one['node_id']

【问题讨论】:

    标签: neo4j py2neo


    【解决方案1】:

    为什么不:

    try:
        node_id = result[0][0]['node_id']
    except IndexError:
        # result is empty
        pass
    

    【讨论】:

    • 好吧,我不想猜测。我不知道为什么会这样。 2,0 文档甚至没有说明返回对象的类型是什么。
    • 我在该声明中收到TypeError: <type 'exceptions.IndexError'> is not JSON serializable
    • 嗯,RecordListList 继承自 list,所以它是一个列表。内部的 RecordList 也是可迭代的,所以 [0][0] 之所以有效,是因为您有一个列表列表。如果结果为空,您应该捕获 IndexError。 TypeError 是不相关的,该语句不序列化任何东西......
    • 啊,这解释了一些事情 - 当该行完全不存在时,我在一些负面单元测试中收到错误消息。我一直在使用result[0][0][0]
    猜你喜欢
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多