【问题标题】:Idempotency check in Neo4JNeo4J 中的幂等性检查
【发布时间】:2020-04-07 06:33:10
【问题描述】:

有人知道如何根据现有数据插入到 Neo4J 中吗?这是数据摄取的一部分。

例如,neo4j 中已经有一个属性为updatedAt 的节点。每当接收到新的 pubsub 事件以摄取数据时,我需要检查传入数据和 neo4j 中现有节点的 updatedAt 属性,并决定需要丢弃哪些数据。

最后,neo4j 应该有一个具有最新updatedAt 值的节点。

除了Triggers,APOC还有什么办法吗?

请帮忙。我对 Neo4j 真的很陌生。谢谢

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    我认为您正在寻找的是 Cypher MERGE 查询,更准确地说是 MERGE 查询与 ON CREATEON MATCH。例如:

    MERGE (n:TYPE_OF_NODE { id: 'ID_OF_NODE_TO_BE_FOUND' })
    ON CREATE SET 
        n.createdAt = INPUT_DATE,
        .../* Set other attributes if needed */
    ON MATCH SET n.updatedAt = 
        CASE WHEN n.updatedAt < INPUT_DATE THEN INPUT_DATE ELSE n.updatedAt END,
        ... /* Set other attributes if needed */
    RETURN n
    

    上面的查询检查是否存在给定类型 TYPE_OF_NODEid 等于 ID_OF_NODE_TO_BE_FOUND 的节点。 INPUT_DATE 我的意思是某个日期与接收数据的事件一起接收。

    1. 如果一个节点不存在,就会创建它并设置一些属性 (见ON CREATE SET)。
    2. 如果它存在,那么它将被更新(参见 ON MATCH SET)。具体来说,updateAt 属性将设置为 后面的值,为此我使用了CASE 声明。

    【讨论】:

    • 这是一个很好的解决方案,但有没有一种方法可以让我一次性更新所有属性。而不是一一更新
    • 我找到了使用Neo4J APOC Library 的解决方案。使用apoc.do.when
    • @RahulThampiT 你能粘贴一个显示你想如何使用 apod.do.when 的 sn-p 吗?
    • 抱歉,我现在在查询中进行了更新,我目前正在使用apoc.do.case查询OPTIONAL MATCH (n:Node {&lt;conditions&gt;}) CALL apoc.do.case( [ n IS NULL ,"CREATE(m:Node) SET &lt;properties to be set&gt; RETURN m", n IS NOT NULL AND n.updated_at&lt;"2020-05-08T07:59:04.887Z", "SET &lt;properties to be set&gt; RETURN n" ], "RETURN n", { n:n }) YIELD value RETURN value
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多