带有聚合函数的Neo4j cypher查询返回不完整的结果

带有聚合函数的Neo4j cypher查询返回不完整的结果,neo4j,cypher,graph-databases,Neo4j,Cypher,Graph Databases,各位!!我有一个Neo4j数据库,其中包含在特定时刻访问多个检查站的访客的信息。访客、访问和检查点表示为节点 每个访问者都由其设备MAC地址标识,每个检查点都有一个唯一的id 每个访问节点都包含一个EnterTime属性,即具有特定MAC地址的访问者第一次在相应检查点附近被注意到的时间(自1970年以来的毫秒数) 注:就诊时间应按下次就诊的进入时间与本次就诊的进入时间之差计算。每个检查点可以访问多次 使用以下密码查询创建数据库: //Create visitors: CREATE (Visito

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

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

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

注:就诊时间应按下次就诊的进入时间与本次就诊的进入时间之差计算。每个检查点可以访问多次

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

//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)  
我正在编写一个密码查询,以查找访问每个检查点的总时间。 我正在尝试这个:

match (vr: Visitor)-->(v1: Visit)-->(cp1: CheckPoint),
 (vr)-->(v2: Visit)-->()
where v2.EnterTime > v1.EnterTime
with cp1.CheckPointId as CheckPointId,
     v1.EnterTime as EnterTime,
     min((v2.EnterTime - v1.EnterTime) / 60000) as visit_duration
return CheckPointId, sum(visit_duration) as total_visit_duration
order by CheckPointId;
结果应该是:

cp1  - 48 min
cp2 – 40 min
cp3 – 65 min
cp4 – 115 min
cp5 – 10 min
但我的查询返回的结果不正确:

cp1  - 23 min
cp2 – 40 min
cp3 – 65 min
cp4 – 115 min
cp5 – 10 min
显然,错误在于没有考虑访问者(mac==00:0a:95:9d:68:17)访问id==1的检查点的时间长度。但这是我的猜测

我的问题是什么?如何改进以返回正确的结果


非常感谢您的帮助!谢谢

我想你要找的是:

match ()<--(v2:Visit)<--(vr: Visitor)-->(v1: Visit)-->(cp1: CheckPoint)
where v2.EnterTime > v1.EnterTime
with vr,
 cp1.CheckPointId as CheckPointId,
 v1.EnterTime as EnterTime,
 min((v2.EnterTime - v1.EnterTime) / 60000) as visit_duration
return CheckPointId, sum(visit_duration) as total_visit_duration
order by CheckPointId;
match()(cp1:检查点)
其中v2.EnterTime>v1.EnterTime
有了虚拟现实,
cp1.CheckPointId作为检查点ID,
v1.EnterTime作为EnterTime,
最小(v2.EnterTime-v1.EnterTime)/60000)就诊持续时间
返回检查点ID,总和(就诊持续时间)作为总就诊持续时间
按检查点ID排序;
我用语句在
中添加了
vr
。Cypher根据您用
语句输入的所有值进行分组。代码不起作用的原因是,访客1和访客2的检查点1的输入时间是相同的。因为您在
with
语句中只有
EnterTime
CheckpointID
,所以cypher按
EnterTime
分组,因此因为您有
min(v2.EnterTime-v1.EnterTime)
它只取较小的一个,而不同时使用这两个。现在我们在
with
语句中引入了
Visitor
,它也将按Visitor分组,这解决了我们的问题,如果两个人同时启动相同的检查点


希望这有帮助

谢谢!它解决了这个问题!我非常感谢你的帮助!希望它对其他与Neo4j和cypher斗争的人有用。