【问题标题】:How to select all the items above threshold or at least the first item?如何选择高于阈值的所有项目或至少第一项?
【发布时间】:2021-06-04 16:12:34
【问题描述】:

我被这个问题困扰了一天,似乎没有开箱即用的简单方法可以做到这一点,所以我在这里。

要复制数据库,我们可以使用这些查询

CREATE (:Score {value: 0.2})
CREATE (:Score {value: 0.3})
CREATE (:Score {value: 0.4})
CREATE (:Score {value: 0.5})
CREATE (:Score {value: 0.38})
CREATE (:Score {value: 0.35})

我想要的基本上是返回值高于某个阈值的所有节点,如果没有这样的节点可用,则只返回具有最大值的节点

例如,如果阈值是0.35,那么我希望查询返回节点

(Score {value: 0.4})
(Score {value: 0.5})
(Score {value: 0.38})

因为上述所有节点的值都大于阈值

但是如果阈值是0.6 那么它应该只返回节点

(Score {value: 0.5})

因为没有节点符合这个阈值,但 0.5 是最大值

【问题讨论】:

    标签: neo4j cypher graph-databases


    【解决方案1】:

    仅使用普通的 Cypher,您可以做到这一点,但根据您拥有的分数节点的数量,它可能效率不高:

    MATCH (n:Score) 
    WHERE n.value>0.35
    WITH collect(n) AS nodes
    MATCH (n:Score)
    WITH max(n.value) as value, nodes
    MATCH (n:Score) WHERE n.value=value
    RETURN CASE WHEN size(nodes)=0 THEN n ELSE nodes END
    

    APOC 的 when 应该表现更好,但您应该在图表上尝试一下:

    MATCH (n:Score) 
    WHERE n.value>0.35
    WITH collect(n) as nodes
    
    CALL apoc.when(
      size(nodes)=0,
      'MATCH (n:Score) WITH max(n.value) AS value, nodes MATCH (n:Score) WHERE n.value=value RETURN n',
      'UNWIND nodes AS node RETURN node',
      {nodes:nodes})
    YIELD value
    RETURN value
    

    【讨论】:

    • 这个问题是score 节点是经过大量计算得出的。如果没有基于阈值的匹配项,我不能只在 apoc 内再次运行匹配项。有没有我可以临时复制它,所以我不必在 apoc 内再次匹配它?
    • 大量计算是什么意思?它是节点上的属性还是其他什么?
    • 我的意思是 (n:Score) 东西在数据库中并不容易获得。在计算该分数之前有很多计算。在此之前它就像一个 50 行查询。我只是这样说是为了简化每个人的事情。理想情况下,它有一堆数学公式和很多 where 子句和其他东西来计算这个分数节点。所以如果没有高于阈值的匹配项,我不能只是MATCH (n:Score)。我需要能够保存这些计算的结果,并以某种方式创建一个临时变量,首先检查是否有任何高于阈值,如果没有则选择第一个。
    • 哦,好的...在问题中这么说会很好:-)您对此建模的方式可能会显着改变查询,因此最好分享更多详细信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    相关资源
    最近更新 更多