Получение максимальной записи с разными значениями с использованием шифра
У меня есть график с пространственными данными с использованием пространственного плагина.
Этот график имеет "Зоны угроз" (полигоны), которые могут располагаться поверх других, поэтому они также имеют свойство z-index.
Каждая "Зона угроз" привязана к сценариям угроз от 1 до N, иногда несколько "Зон угроз" присоединяются к одному и тому же сценарию угрозы с разными свойствами.
Я пытаюсь получить верхнюю зону угрозы для каждого сценария угрозы на основе z-индекса для конкретного местоположения.
Это мой текущий запрос, который почти идеален:
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, чтобы получить то, что я хочу, и / или использовать вложенный запрос для извлечения намерения / возможности (что я и хочу)?
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
значение.