neo4j 中的出租车共享调度
Taxi sharing scheduling in neo4j
我想就我的 java 计算共享乘车出租车调度的应用程序提出一些建议和想法。
假设我有一辆载有两个用户(乘客)的出租车。用户将共享行程,但两位乘客位于不同的地方,并且将在不同的时间接载 up/dropped。带有接送地点的用户模型是:
(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'
两个选项都可以吗?
我想计算出租车路径调度,以便知道哪个用户必须 picked/dropped first/last,像这样:
Grid4 --- Grid1 --- Grid11 --- Grid9
10:15 10:30 10:45 11:00
(pick (pick (drop (drop
user2) user1) user2) user1)
我的想法是获取每个用户的上车时间值,并将其存储到一个集合(TreeSet)中,然后对下车时间执行相同的操作。这样我就可以得到一个有序的集合。这是个好主意吗??
但是,我应该在哪里存储网格位置(Grid4、Grid1 等)?所以最后,我可以获得出租车的所有信息,去哪里以及什么时间。
有什么建议或想法吗?
提前致谢!
当然,这完全取决于您的要求,但我觉得您缺少一个实体。我可能会称其为 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),但这可能是一个艰难的开始。
我想就我的 java 计算共享乘车出租车调度的应用程序提出一些建议和想法。
假设我有一辆载有两个用户(乘客)的出租车。用户将共享行程,但两位乘客位于不同的地方,并且将在不同的时间接载 up/dropped。带有接送地点的用户模型是:
(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'
两个选项都可以吗?
我想计算出租车路径调度,以便知道哪个用户必须 picked/dropped first/last,像这样:
Grid4 --- Grid1 --- Grid11 --- Grid9
10:15 10:30 10:45 11:00
(pick (pick (drop (drop
user2) user1) user2) user1)
我的想法是获取每个用户的上车时间值,并将其存储到一个集合(TreeSet)中,然后对下车时间执行相同的操作。这样我就可以得到一个有序的集合。这是个好主意吗??
但是,我应该在哪里存储网格位置(Grid4、Grid1 等)?所以最后,我可以获得出租车的所有信息,去哪里以及什么时间。
有什么建议或想法吗?
提前致谢!
当然,这完全取决于您的要求,但我觉得您缺少一个实体。我可能会称其为 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),但这可能是一个艰难的开始。