【问题标题】:Getting the max record with different values using cypher使用密码获取具有不同值的最大记录
【发布时间】:2017-12-01 14:48:06
【问题描述】:

我有一个使用空间插件的空间数据图表。

此图具有“威胁区域”(多边形),可以在另一个之上,因此它们也具有 z-index 属性。

每个“威胁区”附加到 1 到 N 个威胁场景,有时多个“威胁区”附加到同一个威胁场景,具有不同的属性。

我正在尝试根据 z-index 为特定位置获取每个威胁场景的最高威胁区域。

这是我目前几乎完美的查询:

MATCH (asset:Asset{name:'Asset Name'})-[]-(ara:AssetRiskAssessment)
WITH asset, ara
CALL spatial.intersects('threat_zones',asset.wkt) YIELD node 
WITH node, asset, ara
MATCH (node)<-[:FOR]-(tss:ThreatScenarioScore)-[]-(ts:ThreatScenario)
RETURN ts.name, max(node.zindex) AS zindex, tss.intention, tss.capability
ORDER BY ts.name, zindex

我的问题 - 如果我删除 tss.inteniontss.capability 我会得到我正在寻找的东西(正确区域的每个相关威胁场景)但我需要的是 tss.intention 和 @987654325 @。由于它们的值在区域之间不同,因此 max 函数将它们视为不同的记录。

有没有更好的方法来使用 max 函数来获得我想要的和/或使用嵌套查询来提取意图/能力(这就是我所追求的)?

【问题讨论】:

    标签: neo4j cypher neo4j-spatial


    【解决方案1】:

    我认为您正在寻找"arg max" 样式的查询。在这种情况下,使用collect 是可行的方法:

    MATCH (asset:Asset {name:'Asset Name'})-[]-(ara:AssetRiskAssessment)
    WITH asset, ara
    CALL spatial.intersects('threat_zones',asset.wkt) YIELD node 
    WITH node, asset, ara
    MATCH (node)<-[:FOR]-(tss:ThreatScenarioScore)-[]-(ts:ThreatScenario)
    WITH node, tss, ts
    ORDER BY ts.name ASC, node.zindex DESC
    WITH
      ts.name AS name,
      collect({
        zindex: node.zindex, intention: tss.intention, capability: tss.capability
      })[0] AS max
    RETURN
      name,
      max.zindex AS zindex,
      max.intention AS intention,
      max.capability AS capability
    

    这将根据它们的name(升序)对元组进行排序,但更重要的是,根据它们的zindex 以降序排列。因此,当zindextss 属性被收集到一个列表中时,第一项(索引[0])将保存具有最大zindex 值的元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 1970-01-01
      相关资源
      最近更新 更多