在 Neo4j 中绘制宿舍运动图

graphing dorm movements in 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 是唯一的

然后我对房间做了同样的事情。

然后我将学生加载为

使用来自 'file://c:/event.csv' 的 headers 的定期提交 1000 加载 csv 作为行合并 (s:Student {id: line.SID});

我也对房间和访问量做了同样的事情。

我完全不知道如何建立关系来回答上述问题。每个事件都列出了学生进入和离开房间的时间,但没有列出学生去过的房间。从摘录开始,是否应该更改摘录以使其包含学生离开的房间?如果有人能帮我谈谈我需要如何思考需要建立的关系,那将不胜感激。

干杯

正如流行的说法,剥削 Ouphe 或挫败法师的方法不止一种。您可以这样做的一种方法(这是最简单的建模 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;

所以实际上你只会有 StudentRoom 作为节点和一个学生 VISIT访问一个房间将构成关系(enter/leave 次作为该关系的属性)。现在,如您所见,这可能不适合您的第二个查询(尽管它确实有效)。一种替代方法是使用 Visit 节点并将其链接(作为时间轴事件)到学生和房间。有很多关于如何做到这一点的例子。

希望这对您有所帮助, 汤姆