在neo4j中滑动时间窗口查询

时间:2014-09-18 12:32:21

标签: neo4j cypher

我的数据按以下方式组织:

(:Node {id:<int>})-[:INTERACTED_WITH {time:<epoch integer>}]->(:Node {id:<int>})

CREATE INDEX ON :INTERACTED_WITH(time)

即。节点在特定时间与其他节点交互。

我想要的查询是一个滑动窗口。我只是计算任何两个节点在滑动较长时间间隔的窗口期间的交互。对于单个窗口,查询为:

MATCH (a:Node)-[r:INTERACTED_WITH]->(b:Node) WHERE
r.time >= <window_start_time> AND
r.time < <window_start_time + window_size>
RETURN a.id, b.id, COUNT(r)

我现在正在以编程方式执行完整查询,在while循环中,但我发现它非常慢。

我正在寻找的内容基本上等同于类似SQL的滑动窗口查询,您可以在其中动态创建一系列窗口启动时间(作为临时表),并基于此查询数据库中的表。

Cypher有类似的东西吗?

1 个答案:

答案 0 :(得分:0)

有几种方法可以做到这一点。举个例子,你可以写

UNWIND range(<start time>, <end time>, <step size>) AS t
MATCH (a:Node)-[r:INTERACTED_WITH]->(b:Node)
WHERE r.time >= t AND r.time < t + window_size
RETURN a.id, b.id, COUNT(r)

您还可以创建一组将窗口边界作为属性的临时节点。假设你有那些,你可以写

MATCH (c:Window)
MATCH (a:Node)-[r:INTERACTED_WITH]->(b:Node)
WHERE r.time >= c.start_time AND r.time < c.end_time
RETURN a.id, b.id, COUNT(r)

完成后,您可以删除:Window节点。