【问题标题】:Neo4J: Return latest data node for each value of a given keyNeo4J:返回给定键的每个值的最新数据节点
【发布时间】:2020-09-19 02:15:56
【问题描述】:

我正在处理 Neo4J 中定期更新的数据集,我想编写一个查询,该查询将为我获取数据库中给定键的每个值的最新数据节点,但我不确定如何去做。

这是我的数据外观的示例(简化):

[
  {
    "timestamp": "<timestamp - 3 days ago>",
    "component": "a",
    "value": "1"
  },
  {
    "timestamp": "<timestamp - 1 day ago>",
    "component": "a",
    "value": "2"
  },
  {
    "timestamp": "<timestamp - 6 days ago>",
    "component": "b",
    "value": "5"
  },
  {
    "timestamp": "<timestamp - 4 days ago>",
    "component": "b",
    "value": "9"
  },
  {
    "timestamp": "<timestamp - 2 days ago>",
    "component": "b",
    "value": "11"
  },
  ...
}

从这个示例数据中,我想为每个唯一的component 返回一行,这将是基于时间戳的最新数据:

[
  {
    "timestamp": "<timestamp - 1 day ago>",
    "component": "a",
    "value": "2"
  },
  {
    "timestamp": "<timestamp - 2 days ago>",
    "component": "b",
    "value": "11"
  },
  ...
]

或者,如果我只返回我关心的特定列:

| component | value |
| ---       | ---   |
| a         | 2     |
| b         | 11    |
| ...       | ...   |

有没有一种简洁的好方法可以用 cypher 做到这一点?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    假设您将数据放入参数中,您可以这样做

    // back to rows
    UNWIND $data AS row
    
    // order by timestamp
    WITH row.component AS component,
         row.timestamp AS timestamp,
         row.value AS value
    ORDER BY timestamp DESC
    
    // get first item in the sorted collection
    WITH component,
         COLLECT({timestamp:timestamp,value:value})[0] AS tsval
    
    // construct the array
    RETURN COLLECT({timestamp:tsval.timestamp,component:component,value:tsval.value}) AS result
    

    或者只是

    RETURN component,tsval.value AS value 
    

    【讨论】:

      【解决方案2】:

      假设列表作为data parameter 传递给查询,则此查询使用aggregating function COLLECT

      UNWIND $data AS d
      WITH d
      ORDER BY d.timestamp DESC
      RETURN d.component AS component, COLLECT(d.value)[0] AS value
      

      产生如下所示的结果:

      ╒═══════════╤═══════╕
      │"component"│"value"│
      ╞═══════════╪═══════╡
      │"b"        │"11"   │
      ├───────────┼───────┤
      │"a"        │"2"    │
      └───────────┴───────┘
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-18
        • 2017-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-26
        相关资源
        最近更新 更多