Neo4j计算最大并发会话数

时间:2015-08-18 11:58:27

标签: neo4j

每个会话都有一个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,因此我不知道该怎么做......

3 个答案:

答案 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