我有一个使用空间插件的空间数据图。
此图表具有“威胁区域”(多边形),它们可以位于另一个之上,因此它们也具有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.intenion
,tss.capability
我正在寻找我正在寻找的东西(正确区域的每个相关威胁情景),但我需要的是{{{ 1}}和tss.intention
。由于区域之间的值不同,因此max函数将它们视为不同的记录。
有没有更好的方法来使用max函数来获取我想要的东西和/或使用嵌套查询来提取意图/能力(这就是我所追求的)?
答案 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
的降序排序。因此,当zindex
和tss
属性收集到列表中时,第一个项(索引[0]
)将保存具有最大zindex
值的元素。