皆さん!特定の瞬間に多数のチェックポイントにアクセスした訪問者に関する情報を含むNeo4jデータベースがあります。訪問者、訪問者、およびチェックポイントは、ノードとして表されます。集計関数を使用したNeo4jのcypherクエリは、不完全な結果を返します
各訪問者は、デバイスのMACアドレスで識別され、各チェックポイントには一意のIDが割り当てられます。
各訪問ノードには、特定のMACアドレスを持つ訪問者がそれぞれのチェックポイントの近くで最初に通知された時刻(1970年以降のミリ秒数)であるEnterTimeプロパティが含まれています。
注:訪問の継続時間は、次の訪問のEnterTimeとこの訪問のEnterTimeの差として計算する必要があります。各チェックポイントは複数回訪問されることがあります。
データベースは、このサイファー・クエリを使用して作成されます
//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)
私は、各チェックポイントへの訪問の合計時間を見つけるために、CYPHERクエリを書いています。 私はこの1つをしようとしています:結果がでなければなりません
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
明らかに、エラーがの長さをid == 1のチェックポイントへのビジター訪問(mac == 00:0a:95:9d:68:17)は考慮されていません。しかし、それは私の推測です。
質問にはどのような問題がありますか?正しい結果を返すためにどのように改善できますか?
お手数をおかけします。ありがとう!
ありがとうございました!それは問題を解決しました!私はあなたに助けてくれて非常に感謝しています! Neo4jとcypherに苦労している他の人にも役立つことを願っています。 – zavanton