【问题标题】:NEO4J - Return node based on max or min valuesNEO4J - 根据最大​​值或最小值返回节点
【发布时间】:2019-03-03 13:00:52
【问题描述】:

我用以下命令构建了一个网络:

LOAD CSV WITH HEADERS FROM 'file:///trial.csv' AS row
MERGE(s:Person {id: row.Sender})
MERGE(r:Person {id: row.Receiver})
SET r.goodness = row.`goodness`
MERGE (s)-[hr:SENDS_TO]->(r)
SET hr.fairness = row.fairness

并且我想返回具有最高善良或公平关系的节点。我只能用这个:

MATCH (s:Person)
RETURN max(s.goodness)

返回最大的善良分数 并用它来返回人,但它不起作用:

MATCH (s:Person)
WHERE s.goodness = max(s.goodness)
return s

知道我哪里出错了吗?

【问题讨论】:

    标签: networking graph neo4j cypher


    【解决方案1】:

    您可能忘记将您的善良/公平转化为数字! toIntegertoFloat

    是的,因为您正在执行的聚合只能在投影(WITH 或 RETURN)中而不是在表达式中进行。你有两个选择:

    MATCH (s:Person)
    RETURN s
    ORDER BY s.goodness DESC LIMIT 1
    

    (如果您在 3.5 上并且在 s.goodness 上有一个索引并使用此语句,则可以从基于索引的排序中受益)。

    MATCH (s:Person)
    WHERE s.goodness > 0
    RETURN s
    ORDER BY s.goodness DESC LIMIT 1
    

    或者您可以使用这种方法,它有点贵,而且还需要一个良好的索引才能运行良好。

    MATCH (s:Person)
    WITH max(s.goodness) as max
    MATCH (s:Person) WHERE s.goodness = max
    RETURN s
    

    (可能返回不止一个人)

    【讨论】:

    • 谢谢!是否也可以查询公平性?哪个是节点之间的浮点属性?
    • 也可以使用上面的代码查询例如最大善良分数,但将公平值限制在0.5到1之间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    相关资源
    最近更新 更多