【问题标题】:Returning the altered (by apoc.trigger) version of node instead of the original返回节点的更改(通过 apoc.trigger)版本而不是原始版本
【发布时间】:2019-10-31 05:26:21
【问题描述】:

我正在使用 python 螺栓驱动程序在 neo4j 数据库中创建节点。这些节点被apoc.trigger 函数改变。我希望返回的BoltStatementResult 包含这些节点的更改版本。

这是我迄今为止测试过的:

  1. 我的触发器按预期工作。存储的节点已正确更改。
  2. 我尝试了“之前”和“之后”阶段。
  3. 我将触发函数设置为返回更改后的版本。
  4. 我确实编写了第二个查询来获取数据库的新节点和更新节点。但是这个选项非常不安全,因为它没有唯一标识符。

我的触发函数:

CALL apoc.trigger.add(
    'onCreateNodeAddMetadata',
    'UNWIND {createdNodes} AS n
     SET n.uid = apoc.create.uuid(), n.timestamp = timestamp() RETURN n',
    {phase: 'before'}
)

我希望 session.write_transaction 的返回值包含添加的属性。

【问题讨论】:

    标签: python-3.x neo4j cypher neo4j-apoc neo4j-driver


    【解决方案1】:

    作为一种安全的解决方法(但请参阅下面的警告),write_transaction 中的 Cypher 查询可以返回已创建节点的本机 ID(例如,RETURN ID(n))。

    然后,只要您知道该节点未被删除,您就可以使用该 ID 对其执行查询(在本例中,myID 包含ID 值并作为parameter) 传递:

    MATCH (n) WHERE ID(n) = $myId
    ...
    

    如果节点在通过本地 ID 搜索之前就可以删除,那么这种技术是不安全的,因为 neo4j 可以将已删除节点的本地 ID 重新分配给另一个新创建的节点。 em>

    【讨论】:

    • 我试图绕过内部 id。但由于我不打算实施删除触发器。我认为这是目前要走的路。谢谢。
    猜你喜欢
    • 2021-02-28
    • 2020-04-26
    • 1970-01-01
    • 2020-08-12
    • 2018-06-22
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多