neo4jの初心者であり、以前の質問で非常に寛大な助けを借りていたので、まだ苦労しているので、もう一度運を試してみようと思いました.
シナリオの例は、家に入り、ある部屋から別の部屋へと歩く学生のシナリオです。旅は特定の部屋で開始または終了する必要はありませんが、学生が部屋に入る順序は重要です。
私が知りたいのは、学生がたどったすべての完全なパスと、問題のパスがたどられた回数のカウントです。以下は、サンプル データと私が試したことです (以前の質問の回答と一連のブログ投稿のおかげです)。
ファイル dorm.csv
ID|SID|EID|ROOM|ENTERS|LEAVES
1|1|12|BLUE|1/01/2015 11:00|4/01/2015 10:19
2|2|18|GREEN|1/01/2015 12:11|1/01/2015 12:11
3|2|18|YELLOW|1/01/2015 12:11|1/01/2015 12:20
4|2|18|BLUE|1/01/2015 12:20|5/01/2015 10:48
5|3|28|GREEN|1/01/2015 18:41|1/01/2015 18:41
6|3|28|YELLOW|1/01/2015 18:41|1/01/2015 21:00
7|3|28|BLUE|1/01/2015 21:00|9/01/2015 9:30
8|4|36|BLUE|1/01/2015 19:30|3/01/2015 11:00
9|5|40|GREEN|2/01/2015 19:08|2/01/2015 19:08
10|5|40|ORANGE|2/01/2015 19:08|3/01/2015 2:43
11|5|40|PURPLE|3/01/2015 2:43|4/01/2015 16:44
12|6|48|GREEN|3/01/2015 11:52|3/01/2015 11:52
13|6|48|YELLOW|3/01/2015 11:52|3/01/2015 17:45
14|6|48|RED|3/01/2015 17:45|7/01/2015 10:00
Student、Room、および Visit のノードを作成します。ここで、Visit は、ID プロパティによって一意に識別される部屋に学生が入るイベントです。
CREATE CONSTRAINT ON (student:Student) ASSERT student.studentID IS UNIQUE;
CREATE CONSTRAINT ON (room:Room) ASSERT room.roomID IS UNIQUE;
CREATE CONSTRAINT ON (visit:Visit) ASSERT visit.visitID IS UNIQUE;
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///dorm.csv" as line fieldterminator '|'
MERGE (student:Student {studentID: line.SID})
MERGE (room:Room {roomID: line.ROOM})
MERGE (visit:Visit {visitID: line.ID, roomID: line.ROOM, studentID: line.SID, ticketID: line.EID})
create (student)-[:VERB]->(visit)-[:OBJECT]->(room)
PREV 関係を作成すると、学生が移動する順序または順序付けが可能になります。これには、ファイル dormprev.csv のデータが使用されます。生徒が 1 つの部屋しか訪問していない場合、この ID は訪問をリンク/チェーンすることを目的としているため、dormprev ファイルには表示されません。以下のデータ
ID|PREV_ID|EID
3|2|18
4|3|18
6|5|28
7|6|28
10|9|40
11|10|40
13|12|48
14|13|48
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///dormprev.csv" as line fieldterminator '|'
MATCH (new:Visit {visitID: line.ID})
MATCH (old:Visit {visitID: line.PREV_ID})
MERGE (new)-[:PREV]->(old)
以下のクエリですべての学生の旅を表示できます
MATCH (student:Student)-[:VERB]->(visit:Visit)-[:OBJECT]-(room:Room)
RETURN student, visit, room
ただし、完全なパスですべての部屋を返す方法がわかりません。
このクエリを実行すると
MATCH p = (:Visit)<-[:PREV]-(:Visit) return p
たとえば、学生ID 2の場合、緑と黄が返され、次に黄と青が別のペアとして返されることがわかります-それを緑、黄、青として表示したい
これは、以下のクエリを実行すると、次のことも意味します。
MATCH p = (:Visit)<-[:PREV]-(:Visit)
WITH p, EXTRACT(v IN NODES(p) | v.roomID) AS rooms
UNWIND rooms AS stays
WITH p, COUNT(DISTINCT stays) AS distinct_stays
WHERE distinct_stays = LENGTH(NODES(p))
RETURN EXTRACT(v in NODES(p) | v.roomID), count(p)
ORDER BY count(p) DESC
意味がある場合は、「パス全体」の数ではなく、それらのペアリングの数を返します。
たとえば、SID 2 と SID 3 は両方とも、緑、黄、青の順に部屋を訪れます。SID 5 は、GREEN、ORANGE、PURPLE の順にアクセスします。
私が見たいと思っているのは:
[GREEN, YELLOW, BLUE] 2
[GREEN, ORANGE, PURPLE] 1
など 上記のモデルでそれは可能ですか?訪問される部屋の数は保証されておらず、1 から * までのいずれかになります。ただし、訪問する部屋が 1 つだけの場合、それはあまり重要ではないため、このモデルが理にかなっている可能性があると考えたのはそのためです (これも一連のブログ投稿から盗みました)。
上記が理にかなっているかどうかはわかりませんが、どんな助けでも大歓迎です-これは優れたユースケースになり、本当に便利です.
ご親切にありがとうございました。