2017-12-01 8 views
1

私は空間プラグインを使用して空間データを持つグラフを持っています。cypherを使用して異なる値を持つ最大レコードを取得する

このグラフには、「脅威ゾーン」(ポリゴン)があり、他のものの上に置くことができ、z-indexプロパティもあります。

各 "脅威ゾーン"は、1〜N個の脅威シナリオに関連付けられています。異なる脅威シナリオに複数の「脅威ゾーン」が異なるプロパティで接続されることがあります。

私は、特定の場所の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.inteniontss.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によります。したがって、zindexとのプロパティがリストに収集されるとき、最初の項目(インデックス[0])は最大値がzindexの要素を保持します。

関連する問題