2017-04-02 9 views
1

皆さん!特定の瞬間に多数のチェックポイントにアクセスした訪問者に関する情報を含む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)は考慮されていません。しかし、それは私の推測です。

質問にはどのような問題がありますか?正しい結果を返すためにどのように改善できますか?

お手数をおかけします。ありがとう!

答えて

2

私は、あなたが探していることはこれだと思う:私はwith文でvrを追加

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; 

。あなたが入れたすべての値によってCypherグループwithステートメント。あなたのコードが動作しなかった理由は、訪問者1と2のチェックポイント1のためにv1.EnterTimeが同じであるためです。 EnterTimeCheckpointIDwithの文にあるため、EnterTimeでグループ化されています。したがって、min(v2.EnterTime - v1.EnterTime)を持っているため、小さなものだけを取り出して両方を使用しませんでした。 withステートメントにVisitorを紹介しましたので、2人で同時に同じチェックポイントを開始すると、私たちの問題を解決する訪問者によってもグループ化されます。

希望します。

+0

ありがとうございました!それは問題を解決しました!私はあなたに助けてくれて非常に感謝しています! Neo4jとcypherに苦労している他の人にも役立つことを願っています。 – zavanton

関連する問題