Neo4j-Can';t在聚合函数中使用聚合函数

Neo4j-Can';t在聚合函数中使用聚合函数,neo4j,cypher,graph-databases,Neo4j,Cypher,Graph Databases,各位!!我有一个Neo4j数据库,其中包含在特定时刻访问多个检查站的访客的信息。访客、访问和检查点表示为节点 每个访问者都由其设备MAC地址标识,每个检查点都有一个唯一的id 每个访问节点都包含一个EnterTime属性,即具有特定MAC地址的访问者第一次在相应检查点附近被注意到的时间(自1970年以来的毫秒数) 注:就诊时间应按下次就诊的进入时间与本次就诊的进入时间之差计算 我的目标是找到一些访问的统计数据,例如, 1) 特定访客访问的平均时间, 2) 访问特定商店的平均时间, 3) 最受欢迎

各位!!我有一个Neo4j数据库,其中包含在特定时刻访问多个检查站的访客的信息。访客、访问和检查点表示为节点

每个访问者都由其设备MAC地址标识,每个检查点都有一个唯一的id

每个访问节点都包含一个EnterTime属性,即具有特定MAC地址的访问者第一次在相应检查点附近被注意到的时间(自1970年以来的毫秒数)

注:就诊时间应按下次就诊的进入时间与本次就诊的进入时间之差计算

我的目标是找到一些访问的统计数据,例如, 1) 特定访客访问的平均时间, 2) 访问特定商店的平均时间, 3) 最受欢迎的商店(即总访问时间最长的商店) 4) 最受欢迎的商店(即平均访问时间最长的商店)等

使用以下密码查询创建数据库:

//Create visitors:
CREATE (Visitor1: Visitor {MAC:'00:0a:95:9d:68:16'})
CREATE (Visitor2: Visitor {MAC:'00:0a:95:9d:68:17'})
CREATE (Visitor3: Visitor {MAC:'00:0a:95:9d:68:18'})

//Create CheckPoints:
CREATE (CheckPoint1: CheckPoint {CheckPointId: 1})
CREATE (CheckPoint2: CheckPoint {CheckPointId: 2})
CREATE (CheckPoint3: CheckPoint {CheckPointId: 3})
CREATE (CheckPoint4: CheckPoint {CheckPointId: 4})
CREATE (CheckPoint5: CheckPoint {CheckPointId: 5})


//Create visits:
//by visitor 1:
CREATE  (Visitor1)-[:MAKES]->(Visit1: Visit {EnterTime: 1488358800000})-[:TO]->(CheckPoint1)
CREATE  (Visitor1)-[:MAKES]->(Visit2: Visit {EnterTime: 1488359400000})-[:TO]->(CheckPoint2)
CREATE  (Visitor1)-[:MAKES]->(Visit3: Visit {EnterTime: 1488361200000})-[:TO]->(CheckPoint3)
CREATE  (Visitor1)-[:MAKES]->(Visit4: Visit {EnterTime: 1488363600000})-[:TO]->(CheckPoint4)
CREATE  (Visitor1)-[:MAKES]->(Visit5: Visit {EnterTime: 1488364800000})-[:TO]->(CheckPoint5)
CREATE  (Visitor1)-[:MAKES]->(Visit6: Visit {EnterTime: 1488365400000})-[:TO]->(CheckPoint1)

//by visitor 2:
CREATE  (Visitor2)-[:MAKES]->(Visit7: Visit {EnterTime: 1488358800000})-[:TO]->(CheckPoint1)
CREATE  (Visitor2)-[:MAKES]->(Visit8: Visit {EnterTime: 1488360300000})-[:TO]->(CheckPoint4)
CREATE  (Visitor2)-[:MAKES]->(Visit9: Visit {EnterTime: 1488362400000})-[:TO]->(CheckPoint2)
CREATE  (Visitor2)-[:MAKES]->(Visit10: Visit {EnterTime: 1488363000000})-[:TO]->(CheckPoint1)

//by visitor 3:
CREATE  (Visitor3)-[:MAKES]->(Visit11: Visit {EnterTime: 1488353820000})-[:TO]->(CheckPoint1)
CREATE  (Visitor3)-[:MAKES]->(Visit12: Visit {EnterTime: 1488354600000})-[:TO]->(CheckPoint4)
CREATE  (Visitor3)-[:MAKES]->(Visit13: Visit {EnterTime: 1488358200000})-[:TO]->(CheckPoint3)
CREATE  (Visitor3)-[:MAKES]->(Visit14: Visit {EnterTime: 1488359700000})-[:TO]->(CheckPoint1)  
请帮我正确地写出问题1-4。 到目前为止,我有一个查询,它将特定访问者的访问持续时间输出到每个检查点(它工作正常):

但当我尝试平均访问持续时间时:

match (vr: Visitor {MAC: '00:0a:95:9d:68:16'})-->(v1: Visit)-->(cp1: CheckPoint)
optional match (vr: Visitor {MAC: '00:0a:95:9d:68:16'})-->(v2: Visit)-->(cp2: CheckPoint)
where v2.EnterTime > v1.EnterTime
return avg(min((v2.EnterTime - v1.EnterTime) / 60000)) as avg_visit_duration;
它返回一条错误消息:

Error occurred: Can't use aggregate functions inside of aggregate functions.
可能,我需要使用WITH子句,但到目前为止,我无法使用WITH子句编写一个能给出正确结果的查询(110分钟)


有什么想法吗?非常感谢您的帮助!谢谢

如果需要传递另一个聚合函数的聚合函数的结果,请使用通过
。大概是这样的:

match (vr: Visitor {MAC: '00:0a:95:9d:68:16'})-->(v1: Visit)-->(cp1: CheckPoint)
optional match (vr)-->(v2: Visit)-->(cp2: CheckPoint)
where v2.EnterTime > v1.EnterTime
with cp1.CheckPointId as CheckPointId, 
     v1.EnterTime as EnterTime, 
     min((v2.EnterTime - v1.EnterTime) / 60000) as visit_duration
return sum(visit_duration)
stdob的答案很好。这是另一个解决方案。此查询有点过于复杂,但可能对其他查询有用:

MATCH (vr:Visitor {MAC: '00:0a:95:9d:68:16'})-->(v:Visit)-->(:CheckPoint)
WITH vr, v
ORDER BY v.EnterTime
WITH vr, collect(v.EnterTime / 60000) AS visitTimes
WITH vr, visitTimes, range(0, length(visitTimes) - 2) AS indices
WITH vr, reduce(acc = [], i in indices | acc +  [visitTimes[i+1] - visitTimes[i]]) AS timeDifferences
UNWIND timeDifferences AS timeDifference
RETURN vr, sum(timeDifference)

非常感谢。它确实起作用了!谢谢您的查询也会返回正确的答案!我会尽我所能用它做进一步的实验!
MATCH (vr:Visitor {MAC: '00:0a:95:9d:68:16'})-->(v:Visit)-->(:CheckPoint)
WITH vr, v
ORDER BY v.EnterTime
WITH vr, collect(v.EnterTime / 60000) AS visitTimes
WITH vr, visitTimes, range(0, length(visitTimes) - 2) AS indices
WITH vr, reduce(acc = [], i in indices | acc +  [visitTimes[i+1] - visitTimes[i]]) AS timeDifferences
UNWIND timeDifferences AS timeDifference
RETURN vr, sum(timeDifference)