neo4j中的滑动时间窗口查询

neo4j中的滑动时间窗口查询,neo4j,cypher,Neo4j,Cypher,我的数据按以下方式组织: (:Node {id:<int>})-[:INTERACTED_WITH {time:<epoch integer>}]->(:Node {id:<int>}) 即在特定时间与其他节点交互的节点 我要进行的查询是滑动窗口查询。我只是简单地计算在一个时间间隔较长的窗口中任意两个节点之间的交互。对于单个窗口,查询为: MATCH (a:Node)-[r:INTERACTED_WITH]->(b:Node) WHERE r.t

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

(:Node {id:<int>})-[:INTERACTED_WITH {time:<epoch integer>}]->(:Node {id:<int>})
即在特定时间与其他节点交互的节点

我要进行的查询是滑动窗口查询。我只是简单地计算在一个时间间隔较长的窗口中任意两个节点之间的交互。对于单个窗口,查询为:

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)
MATCH(a:Node)-[r:interactived_WITH]->(b:Node)其中
r、 时间>=和
r、 时间<
返回a.id、b.id、计数(r)
我现在以编程方式在while循环中执行完整查询,但我发现它非常慢

我所寻找的本质上是一个类似于SQL的滑动窗口查询,您可以动态创建一系列窗口开始时间(作为临时表),并基于此查询数据库中的表


塞弗身上有类似的东西吗

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

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)
展开范围(,)为t
匹配(a:Node)-[r:Interactived_WITH]->(b:Node)
其中r.time>=t,r.time
还可以创建一组临时节点,这些节点将窗口边界作为属性。如果你有这些,你可以写

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)
匹配(c:窗口)
匹配(a:Node)-[r:Interactived_WITH]->(b:Node)
其中r.time>=c.start\u时间和r.time

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

这不会影响您的问题,但我相信您的CREATE INDEX语句不会起任何作用。架构索引仅为节点上的标签创建。谢谢。不幸的是,这两个选项仍然比以编程方式多次执行单个查询慢,但这正是我想要的。