【问题标题】:Taxi sharing scheduling in neo4jNeo4j 中的出租车共享调度
【发布时间】:2015-11-02 17:48:38
【问题描述】:

我想问你一些建议和想法,让我的 java 应用程序计算共享乘车的出租车调度。

假设我有一辆出租车,有两个用户(乘客)。用户将共享行程,但两名乘客位于不同的地方,并且将在不同的时间上车/下车。带有接送地点的用户模型是:

(Grid1)<-[:PICK_UP {time:'10:30'}]-(user1)-[:DROP_OFF {time:'11:00'}]->(Grid9)
(Grid4)<-[:PICK_UP {time:'10:15'}]-(user2)-[:DROP_OFF {time:'10:45'}]->(Grid11)

甚至我可以在用户节点中写入所有属性,例如用户 1

pickUpLocation:'Grid1'
pickUpTime:'10:30'
dropOffLocation:'Grid9'
dropOffTime:'11:00'

两个选项都可以吗?

我想计算出租车路径调度,以便知道必须首先/最后选择/丢弃哪个用户,如下所示:

Grid4 --- Grid1 --- Grid11 --- Grid9 
10:15     10:30     10:45      11:00
(pick      (pick    (drop       (drop
user2)     user1)    user2)      user1)

我的想法是获取每个用户的上车时间值,并将其存储到 Collection(TreeSet) 中,然后对下车时间执行相同操作。所以我可以得到一个有序的集合。这是个好主意吗??

但是,我应该在哪里存储网格位置(Grid4、Grid1 等)?所以最后,我可以获得出租车的所有信息,去哪里以及什么时候。

有什么建议或想法吗?

提前谢谢你!

【问题讨论】:

    标签: java graph-databases schedule


    【解决方案1】:

    这当然取决于您的要求,但我觉得您缺少一个实体。我可能会称它为Ride 或“预订”。以下可能是有道理的:

    (:User)-[:BOOKED_RIDE]->(:Ride)
    (:Ride)-[:STARTS_AT]->(:GridItem)
    (:Ride)-[:ENDS_AT]->(:GridItem)
    

    STARTS_AT 可以有一个time 属性。

    对于两个用户,以下 Cypher 可能会提供如何查询的示例:

    MATCH (user1:User), (user2:User)
    MATCH
      (user1)-[:BOOKED_RIDE]->(ride1:Ride),
      (user2)-[:BOOKED_RIDE]->(ride2:Ride),
      (start1)<-[start_rel1:STARTS_AT]-(ride1)-[end_rel1:ENDS_AT]->(end1),
      (start2)<-[start_rel2:STARTS_AT]-(ride2)-[end_rel2:ENDS_AT]->(end2)
    WITH 
      [
        {grid_item: start1, time: start_rel1.time},
        {grid_item: end1, time: end_rel1.time},
        {grid_item: start2, time: start_rel2.time},
        {grid_item: end2, time: end_rel2.time}
      ] AS stops
    UNWIND stops AS stop
    WITH stop
    ORDER BY stop.time
    RETURN collect(stop) AS stops
    

    当然,它可能有更多的逻辑(特别是如果您使用的是 Neo4j Java API),但这可能是一个艰难的开始。

    【讨论】:

    • 谢谢!很好的解释我要去试试。一些观察, :Ride 节点;我不知道它应该有什么属性,或者我可以创建节点,没有属性。另外,你能否给我一些关于我应该如何在neo4j中存储时间的建议。我之前问过stackoverflow.com/questions/33463882/…,但我也想听听你的建议。所以我可以正确运行查询。谢谢
    • Ride 节点没有属性完全没问题。您可以将传入/传出它的三种关系视为某种数据。我认为关于时间的问题的答案非常好,尽管它总是归结为你将如何使用它。我要问自己的第一个问题是,您是否打算使用 Cypher 或您选择的编程语言进行计算
    • 再次感谢您,我已经用格式时间 HH:mm 尝试过您的查询,它有效!你是对的,关于时间这一切都取决于我的需要。所以,可能在某些时候我需要使用另一种格式。谢谢
    • 根据给定的查询结果,计算在给定时间的情况下必须先接哪个用户。你能给我一些建议或想法来计算节点集之间的最短加权路径吗?例如。假设查询结果是 Grid 4 (10:15) - Grid 1(10:30) - G 11(10:45) - G 9(11:00) 但是我需要计算短路路径 btw Grid4 Grid1,然后从 Grid 1 到 Grid 11,依此类推。有没有一种简单的方法可以通过 cyhper 或代码来做到这一点。谢谢
    • 查看shortestPathallShortestPaths 的文档。如果您仍有疑问,请发布 SO 问题,我们会看看我们能做些什么
    猜你喜欢
    • 2021-08-25
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多