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

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

На этом графике есть «зоны угрозы» (полигоны), которые могут располагаться друг над другом, поэтому у них также есть свойство 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, чтобы получить то, что я хочу, и/или использовать вложенный запрос для извлечения намерения/возможности (что мне и нужно)?


person Doron Goldberg    schedule 01.12.2017    source источник


Ответы (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.

person Gabor Szarnyas    schedule 01.12.2017