Получение максимальной записи с разными значениями с использованием шифра

У меня есть график с пространственными данными с использованием пространственного плагина.

Этот график имеет "Зоны угроз" (полигоны), которые могут располагаться поверх других, поэтому они также имеют свойство 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 значение.

Другие вопросы по тегам