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

时间:2017-12-01 14:48:07

标签: neo4j cypher neo4j-spatial

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

此图表具有“威胁区域”(多边形),它们可以位于另一个之上,因此它们也具有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我正在寻找我正在寻找的东西(正确区域的每个相关威胁情景),但我需要的是{{{ 1}}和tss.intention。由于区域之间的值不同,因此max函数将它们视为不同的记录。

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

1 个答案:

答案 0 :(得分: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值的元素。