【问题标题】:Neo4J use WHERE on MAX ParameterNeo4J 在 MAX 参数上使用 WHERE
【发布时间】:2021-10-10 14:16:12
【问题描述】:

我的图表有节点“T”,可以分配一个或多个节点“TV”。这些节点“TV”的不同之处在于参数“version”可以是一个从 0 开始向上计数的整数,它们还有另一个称为“flag”的参数。

我想找到具有“flag = 2”的相应节点“TV”的所有节点“T”。如果有一个“flag = 2”,我想要这个节点“TV”,即使其他相关节点“TV”中的“version”参数比“flag = 2”的节点更高。如果没有“flag = 2”,我希望节点“TV”具有所有现有“TV”节点的最高(最新)“版本”到该节点“T”。

我尝试了几个想法并希望用“max”来捕捉它,但没有成功:

MATCH (tv:TV) -- (t:T)
WITH max(tv.version) as max
MATCH (tv:TV) -- (t:T) WHERE tv.version = max OR tv.flag = 2
RETURN t, tv

关于如何设计查询的任何提示? 谢谢

******* 添加 ******* 对于何塞·巴科伊:

为了更好地理解语句,我已经重写并重命名了节点:

match (t:Transaction)--(v:transactionVersion)  
WHERE t.uuid ="61263a4d3c7cb" 
WITH max(v.versionNumber) as max
match (t:Transaction)--(v:transactionVersion)  
WHERE t.uuid ="61263a4d3c7cb" 
RETURN
CASE 
    WHEN v.versionFlag = 2 THEN v.uuid
    WHEN v.versionNumber = max THEN v.uuid
END AS versionUUID 

结果是我变成了两个节点,一个可能具有 versionFlag = 2,另一个具有最大 versionNumber。 但我想要一个休息之类的东西:如果 Neo4J 发现 versionFlag = 2 它将只返回相应的节点并丢弃其余节点。如果没有找到 versionFlag = 2,我只想获取具有最高 versionNumber 的节点。所以它是一种或者只有一个结果而不是现在两个。

【问题讨论】:

  • 我使用我自己的测试数据尝试了您的查询,它有效。请分享您自己的测试数据,我会检查。谢谢。

标签: neo4j cypher


【解决方案1】:

max() 聚合是不够的,我们需要在这里同时进行另一个聚合来确定是否有任何行包含versionFlag = 2,因为这会改变您以后要进行的比较。

match (t:Transaction)--(v:transactionVersion)  
WHERE t.uuid ="61263a4d3c7cb" 
WITH max(v.versionNumber) as max, max(CASE WHEN v.versionFlag = 2 THEN 2 ELSE 0 END) as flag
WITH max, flag = 2 as useFlag
match (t:Transaction)--(v:transactionVersion)  
WHERE t.uuid ="61263a4d3c7cb" AND ((useFlag AND v.versionFlag = 2) OR (NOT useFlag AND v.versionNumber = max))
RETURN v.uuid AS versionUUID 

【讨论】:

    猜你喜欢
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2017-11-23
    • 1970-01-01
    相关资源
    最近更新 更多