【问题标题】:graphing dorm movements in neo4j在 neo4j 中绘制宿舍移动图形
【发布时间】:2018-07-01 15:31:31
【问题描述】:

我真的很难理解 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 加载 csv 和来自 'file://c:/event.csv' 的标题作为行合并 (s:Student {id: line.SID});

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

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

干杯

【问题讨论】:

    标签: neo4j transfer


    【解决方案1】:

    正如流行的谚语所说,有不止一种方法可以剥掉 Ouphe 的皮 - 或阻止法师。你可以做到的一种方法(这使得建模最简单)如下:

    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 会构成关系(与进入/离开时间作为该关系的属性)。现在,如您所见,这对于您的第二个查询可能并不理想(尽管它确实有效)。一种替代方法是有一个 访问 节点并将其(作为时间线事件)链接到学生和房间。有很多关于如何做到这一点的例子。

    希望这会有所帮助, 汤姆

    【讨论】:

    • 太好了,非常感谢汤姆!我没有 apoc,但添加了一个日期/时间字段作为数字以便能够对其进行排序。还遇到了一系列描述网站流量分析和访问订单页面的博客文章,这看起来像您提到的第二种方法。无论如何,感谢您的所有帮助,非常感谢!
    • 不客气。两个(小)评论。添加 APOC 将为您提供更多功能。确实,它不是 Neo4j 版本的一部分,但是它由 Neo4j 团队中最优秀的团队维护(并与版本保持同步)。其次,在进行查询时,我注意到您的时间不够精细。似乎有人可能在同一“时刻”进入一个房间,离开一个房间并进入下一个房间(这当然是不可能的)。这可能会弄乱更复杂的查询。
    • 谢谢汤姆。我肯定会看看 apoc 但我现在几乎无法启动 neo :-) 还是那个绿色 :-/
    • 您能否解释一下为什么使用 PERIODIC COMMIT LOAD CSV WITH HEADERS FROM "file:///dorm.csv" 作为行字段终止符 '|' MERGE (s:Student {studentID: line.SID}) MERGE (r:Room {roomID: line.ROOM}) MERGE (v:Visit {visitID: line.ID, studentID: line.SID, roomID: line.ROOM} ) 使用带有来自“file:///dorm.csv”的标题的定期提交加载 CSV 作为行字段终止符“|” match (s:Student {studentID:line.SID}), (r:Room {roomID: line.roomID}), (v:Visit {visitID:line.ID}) create (s)-[:VERB]-> (v)-[:OBJECT]->(r)
    • 就 APOC 而言,为您的 Neo4j 版本下载最新的 jar,将其放入插件目录中,重新启动 neo4j 并完成所有设置:-)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多