绘制neo4j中的宿舍运动

时间:2017-05-19 04:08:41

标签: neo4j transfer

我真的在努力让我的头脑绕过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是唯一的

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

然后我将学生加载为

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

我也为房间和访问做了同样的事。

我完全不知道如何创建关系,但能够回答上述问题。每个活动都列出了学生进入和离开房间的时间,但没有列出学生前往的房间。从提取物开始,是否应该更改提取物以使其包含学生留下的空间?如果有人可以帮助我谈谈我需要如何思考需要创建的关系,那将非常感激。

干杯

1 个答案:

答案 0 :(得分:0)

正如流行的谚语所说,有不止一种方法可以让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;

所以实际上你只有学生会议室作为节点,学生访问一个房间会构成关系(与输入/离开时间作为该关系的属性)。现在,正如您所看到的那样,对于您的第二个查询可能并不理想(尽管它确实有效)。另一种方法是使用访问节点并将其链接(作为时间轴事件)给学生和房间。关于如何做到这一点有很多例子。

希望这有帮助, 汤姆