2017-05-19 11 views
0

私は本当にneo4jの周りに頭を抱えていて、誰かが私を下の正しい方向に向けるのを助けることができると願っていました。neo4jのグラフ寮の動き

基本的には、イベントと呼ばれるもののリストがあります。このイベントは、患者が部屋に入ったり出たりすることを説明すると言える。

各イベントには一意の識別子があります。問題の生徒の識別子と、開始時間と終了時間(例えば、生徒が12:00に入室し、12:05に放置された)、およびその部屋の識別子も含まれています。

イベントおよびデータは、以下の線に沿って見えるかもしれません、要求される場合がありますパイプ区切り文字で区切られた列

ID|SID|ROOM|ENTERS|LEAVES 
1|1|BLUE|1/01/2015 11:00|4/01/2015 10:19 
2|2|GREEN|1/01/2015 12:11|1/01/2015 12:11 
3|2|YELLOW|1/01/2015 12:11|1/01/2015 12:20 
4|2|BLUE|1/01/2015 12:20|5/01/2015 10:48 
5|3|GREEN|1/01/2015 18:41|1/01/2015 18:41 
6|3|YELLOW|1/01/2015 18:41|1/01/2015 21:00 
7|3|BLUE|1/01/2015 21:00|9/01/2015 9:30 
8|4|BLUE|1/01/2015 19:30|3/01/2015 11:00 
9|5|GREEN|2/01/2015 19:08|2/01/2015 19:08 
10|5|ORANGE|2/01/2015 19:08|3/01/2015 2:43 
11|5|PURPLE|3/01/2015 2:43|4/01/2015 16:44 
12|6|GREEN|3/01/2015 11:52|3/01/2015 11:52 
13|6|YELLOW|3/01/2015 11:52|3/01/2015 17:45 
14|6|RED|3/01/2015 17:45|7/01/2015 10:00 

質問は次のようになります。学生のxが訪れ、中にいるどの部屋

どのような順序

は、部屋間の学生の動きを何のように見える - 彼らは部屋を出るときに部屋の学生に行くんし、Y

それは十分に簡単に聞こえるが、私は自分自身を結び目に結びつけている。

私は学生と部屋

の両方のためのユニークな制約を作成し始めました(学生:学生)に制約を作成student.idが、私は、その後の部屋のために同じことをやったユニーク

で主張しています。

Iからヘッダ1000負荷CSVコミット周期使用

のようにロードされた生徒ファイル:// C:/event.csvを '線マージとして(S:学生{ID:line.SID})。

私も部屋と訪問のために同じことをしました。

上記の質問に答えることはできますが、関係を作成する方法は全くわかりません。各イベントには、生徒が入室してから退室するまでの時間が表示されますが、出席した部屋は表示されません。抽出物から出発して、学生が残した部屋が含まれるように抽出物を変更すべきか?誰かが私がどのように関係を作り出す必要があるかを話すのを助けることができるなら、それは非常に高く評価されるでしょう。

乾杯

答えて

0
人気の諺にも同様

アウフを肌ために複数の方法がある - または魔術師を阻止が。以下のように(IMO最も簡単なモデリングになります)あなたがそれを行うことの一つの方法は次のとおりです。

CREATE CONSTRAINT ON (s:Student) ASSERT s.studentID IS UNIQUE; 
CREATE CONSTRAINT ON (r:Room) ASSERT r.roomID IS UNIQUE; 

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///dorm.csv" as line fieldterminator '|' 
MERGE (s:Student {studentID: line.SID}) 
MERGE (r:Room {roomID: line.ROOM}) 
CREATE (s)-[:VISIT {starttime: apoc.date.parse(line.ENTERS,'s',"dd/MM/yyyy HH:mm"), endtime: apoc.date.parse(line.LEAVES,'s',"dd/MM/yyyy HH:mm")}]->(r); 

# What rooms has student x visited and in what order 
MATCH (s:Student {studentID: "2"})-[v:VISIT]->(r:Room) 
RETURN r.roomID,v.starttime ORDER BY v.starttime; 

# What does the movement of students between rooms look like - to which room does students go to when they leave room y 
MATCH (s:Student)-[v:VISIT]->(r:Room {roomID: "GREEN"}) 
WITH s, v 
MATCH (s)-[v2:VISIT]->(r2:Room) 
WHERE v2.starttime > v.endtime 
RETURN s.studentID, r2.roomID, v2.starttime ORDER BY s.studentID, v2.starttime; 

だから、実際にあなたが唯一のノードと部屋をINGの学生VISITとして学生ルームを持っているでしょうその関係を構成する(その関係の特性としての入退室時間を用いて)。さて、あなたが見ることができるように、それは2番目のクエリには理想的ではないかもしれません(ただし動作​​します)。 1つの方法は、ノードを訪問し、それを(タイムラインイベントとして)学生とルームの両方に連結することです。それを行う方法については、たくさんの例があります。

希望します。 Tom

+0

優秀、感謝のヒープトム!私はapocを持っていませんが、ソートできるように日付/時刻のフィールドを数値として追加しました。また、ウェブサイトのトラフィックの分析を説明する一連のブログ記事があり、注文ページが訪問されました。これは、あなたが言及する第2のアプローチのようです。とにかく、あなたのすべてのおかげで、ありがとう! – c95mbq

+0

ようこそ。 2つ(小)の発言。 APOCを追加すると、さらに多くの機能が提供されます。これはNeo4jリリースの一部ではありませんが、Neo4jチームの最善の方法で維持されています(リリースと歩調を合わせています)。第二に、クエリを実行するとき、私はあなたの時間が細かくないことに気付きました。誰かが部屋に入って部屋を出て、同じ "瞬間"(もちろん不可能)で次の部屋に入る可能性がありました。それはより複雑なクエリを混乱させるかもしれません。 –

+0

おかげでトム。私は間違いなくapocを見ていますが、緑色なので、現時点ではまだneoを始めることはできません: -/ – c95mbq

関連する問題