2017-12-01 12 views
1

공간 플러그인을 사용하여 공간 데이터가있는 그래프가 있습니다.사이퍼를 사용하여 다른 값으로 최대 레코드 얻기

이 그래프에는 "위협 영역"(다각형)이 있으며, 다른 쪽 위에있을 수 있으므로 z- 색인 속성도 있습니다.

각 "위협 영역"은 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.intentiontss.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에 따라. 따라서 zindextss 속성이 목록에 수집되면 첫 번째 항목 (인덱스 [0])은 최대 값이 zindex 인 요소를 보유합니다.