代码之家  ›  专栏  ›  技术社区  ›  Doron Goldberg

使用cypher获取具有不同值的max记录

  •  1
  • Doron Goldberg  · 技术社区  · 8 年前

    我有一个使用spatial插件的带有空间数据的图。

    该图具有“威胁区域”(多边形),可以位于其他区域的顶部,因此它们也具有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.intention tss。能力 . 由于分区之间的值不同,max函数将其视为不同的记录。

    有没有更好的方法使用max函数来获取我想要的和/或使用嵌套查询来提取意图/能力(这是我想要的)?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Gabor Szarnyas    8 年前

    我想你在找一个 "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 按降序排列。所以当 Z指数 tss 属性被收集到一个列表中,第一项(索引 [0] )将以最大值保存元素 Z指数 价值