使用密码获取具有不同值的最大记录
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.intenion
,tss.capability
我得到了我正在寻找的东西(正确区域的每个相关威胁场景)但我需要的是tss.intention
和 tss.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
降序排列元组。因此,当 zindex
和 tss
属性被收集到列表中时,第一项(索引 [0]
)将保存具有最大 zindex
值的元素。
我有一个使用空间插件的空间数据图表。
此图有 "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.intenion
,tss.capability
我得到了我正在寻找的东西(正确区域的每个相关威胁场景)但我需要的是tss.intention
和 tss.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
降序排列元组。因此,当 zindex
和 tss
属性被收集到列表中时,第一项(索引 [0]
)将保存具有最大 zindex
值的元素。