【问题标题】:How to use complex nested queries in Cypher如何在 Cypher 中使用复杂的嵌套查询
【发布时间】:2019-06-28 00:49:58
【问题描述】:

我在 Cypher 中有一个查询,可以找到某个设备的最后一次。 我想匹配我的数据库中的所有设备,其中它们的最后时间属性是其设备的最新属性,然后返回它们的 id。不幸的是,我无法创建正确的子查询。

我尝试使用 with 和 {} 的示例,但找不到任何有效的方法。

主要部分(有效):

MATCH (a:device)
MATCH (b:device)
WHERE certain filters
RETURN
CASE 
WHEN a.last_seen > MAX(b.last_seen) THEN a.last_seen 
WHEN a.last_seen < MAX(b.last_seen) THEN MAX(b.last_seen)
ELSE a.last_seen END AS lastest

然后我想做:

MATCH (d:device)
WHERE d.last_seen = lastest
RETURN d.device_id

到目前为止,无论我尝试什么,都只会出现语法错误。如何嵌套批量查询?

【问题讨论】:

  • 如果在您的“主要批量”中将RETURN 替换为WITH 会发生什么?
  • 您能分享一下您是如何组合这两个查询的吗?
  • 当我尝试用“with”替换它时,我得到一个语法错误,所以我用错了。应该如何使用?还有 Raj - 这就是我想知道的 :)
  • 请检查我的答案...

标签: neo4j subquery cypher with-statement


【解决方案1】:

您可以使用MAX函数获取最新的last_seen。

然后你就可以用它来获取所有具有latest_seen的设备了。

这是获取 last_seen 最大值的查询,然后获取与此 last_seen 匹配的所有设备。

MATCH (a:device)
WHERE certain filters
WITH MAX(a.last_seen) AS latest_last_seen
MATCH (d:device)
WHERE d.last_seen = latest_last_seen
RETURN d.device_id

某些过滤器替换为您要应用的过滤器。我想您忘记在第二个查询中添加某些过滤器)。

编辑:按照@InverseFalcon 的建议,在属性 last_seen 上添加索引

【讨论】:

  • 为了在最后一场比赛中快速查找,您还需要确保在 :device(last_seen) 上有一个索引
  • 此解决方案仅适用于 1 台设备。我想在我的整个设备数据库上运行它。在这种情况下,Max 在整个情况下都不起作用:/
  • 这适用于所有设备,你能分享一下你得到了什么吗?您在“某些过滤器”中添加了什么?
猜你喜欢
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多