neo4j의 절대적인 멍청한 질문이었고 이전 질문에 매우 관대 한 도움을 받았기 때문에 저는 여전히 고민 중이므로 다시 한 번 운을 시험해 볼 것이라고 생각했습니다.Neo4j의 전체 경로 수와 전체 경로 반환
예시 시나리오는 집에 들어가서 한 방에서 다른 방으로 걸어가는 학생의 시나리오입니다. 여행은 특정 방에서 시작하거나 끝낼 필요는 없지만 학생이 방에 들어가는 순서는 중요합니다.
내가 알고 싶은 것은 학생들이 찍은 모든 길을 문제의 길을 여러 번 찍은 횟수와 함께 나타냅니다. 아래는 샘플 데이터이며, 나는 (블로그 게시물의 시리즈와 함께 이전 질문의 대답 덕분에) 시도했다 :
파일이
학생의 노드를 만드는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
을 dorm.csv을, 방문이 고유 PREV 관계를 만들기 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)
에 의해 식별되는 방에 들어가는 학생의 이벤트 룸 및 방문 순서 또는 학생에 이동하는 순서가.이 파일 dormprev에서 데이터를 사용 할 수 있습니다. CSV. 학생이 한 방만 방문한 경우이 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)
아래와 같이 데이터 I 그러나 아래의 쿼리
MATCH (student:Student)-[:VERB]->(visit:Visit)-[:OBJECT]-(room:Room)
RETURN student, visit, room
모든 학생들의 여행을 볼 수 있습니다, 나는 어떻게 전체 경로의 객실을 반환하는 아무 생각이 없습니다.
나는이 쿼리를 실행하면
MATCH p = (:Visit)<-[:PREV]-(:Visit) return p
내가, 예를 들어, 학생 ID 별도의 쌍으로이 개 반환 녹색과 노란색 후, 노랑, 파랑에 대한 것을 볼 수 있습니다 - 내가 그린 같은 것을 보려는 그 SENS를 만드는 경우
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 모두 GREEN, YELLOW, BLUE 순으로 방문합니다. SID 5는 GREEN, ORANGE, PURPLE 순으로 방문합니다.
내가보고 희망하고있다 :
[GREEN, YELLOW, BLUE] 2
[GREEN, ORANGE, PURPLE] 1
등은 위의 모델이 가능 그래서 누군가가 도와주세요 수 있다면 올바른 방향으로 날 지점? 방문한 객실의 수는 보장되지 않으며 1에서 *까지 가능합니다. 그러나 한 방만 방문하면 관심이 없으므로이 모델이 이해할만한 것으로 생각되는 이유가 있습니다 (다시 블로그 게시물 시리즈에서 도난 당함).
위의 내용이 의미가 있지만 도움이 될만한지 모르겠다. 훌륭한 사용 사례로 유용하며 유용 할 것입니다.
친절한 도움에 감사드립니다.
감사합니다! 관계의 요점에 대해 만들어야 할 농담이 있습니다. 저는 제멋대로로 현저한 억제력을 보여주고 있습니다 ;-) 나는 그 순간에 뭔가 다른 것을 추적해야했지만 주말에 이것을 보길 원합니다. 변수 경로 길이로 쿼리를 변경하는 것과 관련하여 문제가 거의 해결 될 것이라고 생각하지만 하위 경로는 포함하지 않을 것입니다. 반면 "완전한"여행에만 관심이 있습니까? 즉, GYB 대신 [{G, Y}, {Y, B}, {GYB}]라는 쿼리를 사용하면 실제로 G Y B가 세 번 계산됩니다. 감사합니다. 월요일에 다시 게시 할 예정입니다. – c95mbq
예, 분명히 "관계의 핵심"입니다 :-). 어쨌든 시작 지점에 들어오는 [: PREV]가없고 끝 지점에 나가는 [: PREV]가 없도록 몇 가지 추가 요구 사항을 추가 할 수 있습니다. 그렇게하면 완전한 여행 만 할 수 있습니다. –
나는 물건을 바꾸고 결국 PREV 대신 NEXT를 만들었다. 내가 건너 왔던 다른 SO 게시물과 함께 귀하의 의견은 작은 샘플 데이터로 예상 결과를 반환하는 것으로 보이는 아래의 쿼리 결과를 얻었습니다. 'MATCH p = (from : Visit) - [: NEXT *] - > (방문 : 방문) WITH p, EXTRACT (v IN NODES p) | v.roomID) AS 객실 UNWIND 객실은 그대로 유지됩니다. WITH P, COUNT (DISTINCT 숙박) AS distinct_stays WHERE distinct_stays = LENGTH (NODES (p)) RETURN EXTRACT (v의 NODES (p) | v.roomID)), count (p)' 여러분의 모든 도움에 감사드립니다! – c95mbq