每个会话都有一个start_time和一个end_time。
在某段时间内,我想知道最大并发会话数是多少。
MATCH (s:SESSION)
WHERE s.start_time > #{window_start_time}
AND s.end_time < #{window_end_time}
RETURN s
ORDER BY s.start_time
通过start_time排序这些节点,我们可以计算当时正在进行的会话数
MATCH (s:SESSION)
WHERE s.start_time < #{time}
AND s.end_time > #{time}
RETURN count(s)
我不知道如何将这两个问题放在一起。
编辑:
所以窗口一个很简单,但它实际上并没有给出并发会话,只是该窗口中的会话总数。哈利在start_times作为关键点的正确轨道,但他的查询返回每个点的数字,我想将它们量化为窗口,哈哈。它很复杂 - 我真的很接近!
WITH 1441177372629/1000 AS begin,
1441582329570/1000 AS end,
1000*60*60/1000 as step
WITH begin, end, step
MATCH (s:SESSION)
WHERE s.start_time/1000 > begin AND s.end_time/1000 < end
WITH step,
collect(s) as sessions,
range(begin, end, step) AS times,
collect(DISTINCT s.start_time/1000) AS slots
UNWIND times AS time
WITH step, time, sessions,
filter(slot in slots WHERE slot > time AND slot <= time+step) AS timeSlots
WITH time, sessions, reduce(count = 0, slot IN timeSlots |
size(filter(s IN sessions WHERE s.start_time/1000 <= slot AND s.end_time/1000 >= slot))
) AS counts
RETURN time, counts
ORDER BY time
以下是我的问题:
1)时间戳(自epoc以来的ms)溢出32位int!我不断得到负面范围,这就是原因。它很烦人 - 我必须在一堆地方除以1000。也许这是一个更好的方式?
2)我的减少不正确。我想在该窗口中占用并发会话数的最大值,但我不能这样做:
max(count, size(filter(s IN sessions WHERE s.start_time/1000 <= slot AND s.end_time/1000 >= slot)))
我似乎无法在内容中使用WITH或CASE,因此我不知道该怎么做......
答案 0 :(得分:2)
这应该有效,你需要一种窗口函数,我们可以通过聚合不同的开始时间来模拟我们的插槽。
然后为每个开始时间过滤所有在此期间运行的会话。
MATCH (s:Session)
WHERE s.start_time > 12345000 AND s.end_time < 12348000
WITH collect(s) AS sessions, collect(DISTINCT s.start_time) AS slots UNWIND slots AS slot
RETURN slot, size(filter(s IN sessions
WHERE s.start_time <= slot AND s.end_time >= slot)) AS sessions
ORDER BY slot;
答案 1 :(得分:1)
如果您尝试连接两个查询,可以使用和:
MATCH (s:SESSION)
WHERE s.start_time > #{window_start_time}
AND s.end_time < #{window_end_time}
WITH s
ORDER BY s.start_time
WHERE s.start_time < #{time}
AND s.end_time > #{time}
RETURN count(s)
现在第一个语句的结果用于第二个语句。 有关 WITH 的更多信息,请参阅官方文档:http://neo4j.com/docs/stable/query-with.html
答案 2 :(得分:1)
我认为你可以从你的时间窗口开始,并从那里计算并发会话:
测试控制台:http://console.neo4j.org/r/11hw2x
示例查询:
UNWIND range(12345000, 12348000) AS window
MATCH (n:Session)
WHERE n.start_time < window AND n.end_time > window
RETURN window, count(*);
将返回此类结果:
12346647 100
12346961 100
12345588 64
12346306 100
12345561 61
12345247 25
12345902 86