使用密码获取具有不同值的最大记录

Getting the max record with different values using cypher

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

此图有 "Threat Zones"(多边形),它们可以在另一个之上,因此它们也有一个 z-index 属性。

每个 "Threat Zone" 都附加到 1 到 N 个威胁场景,有时多个 "Threat Zones" 附加到具有不同属性的相同威胁场景。

我正在尝试根据特定位置的 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.intentiontss.capability。由于它们的值在区域之间不同,因此 max 函数将它们视为不同的记录。

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

我认为您正在寻找 "arg max" style query. In this case, using 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 值的元素。