2015-01-07 105 views
2

我對Neo4j相當陌生,我試圖構建一個小示例應用程序:一個公共交通規劃師。它看起來如下(顯然非常簡化的例子):neo4j中最短路徑搜索的訪問關係屬性

simplified example

每個總線(跳閘)的出發和到達時間存儲爲關係屬性。我希望公共汽車在特定時間附近(或之後)離開,同時在出發後儘快到達(即不一定是最短但最快的路線)。

我在Cypher中做了很多實驗,但是我一直無法做到這一點。有什麼建議?

編輯:更新圖

updated simplified example

回答

2

要啓用一個簡單的Cypher查詢,你可以改變你的圖形模式是這樣的:

(:Trip)-[:LEG {start: 10, end: 20}]->(:Stop)-[:LEG {start: 30, end: 40}]->(:Stop) ... 
             |         | 
             [:AT]        [:AT] 
             |         | 
             v         v 
           (Location {name: "Paris"})   (Location {name: "London"}) 

總之,每行由鏈N條腿和N站。每個停靠點都與一個位置相關,並且每條腿都存儲其開始和結束時間。

使用上述模型,將返回以下查詢:(a)在時間40或之後開始的最快旅程的路徑,以及(b)該旅程的持續時間。

MATCH p=(t:Trip)-[legs:LEG*1..]->(s:Stop)-[:AT]->(loc:Location) 
WHERE HEAD(legs).start >= 40 AND NOT (s)-[:LEG]->() 
WITH p, LAST(legs).end - HEAD(legs).start AS duration 
RETURN p, duration ORDER BY duration LIMIT 1; 

Here is a console顯示樣本結果。

+0

我一直在試驗你的和我自己的解決方案,並且讓他們都工作('LAST()'和'HEAD()')。但是,現在我遇到了問題(在兩種解決方案中),如果我添加更多的線路,有時會在時間t開始停車a,停下來並在時間 Ben

+0

@Ben我認爲你沒有正確使用我的模型。在抵達之前,不可能離開停止站,因爲連鎖店的所有停靠站都嚴格按照時間順序排列。如果你重新訪問同一個位置,也許你正在重複使用Stop實例 - 這在我的模型中是不允許的(即使你重新訪問一個位置,你也必須創建一個新的Stop)。這是否解決了這個問題?如果沒有,請提供一組顯示問題的數據(例如,在控制檯中)。 – cybersam

+0

我同意把鏈接放在一個鏈條中很重要。你有兩個模型。旅程(鏈接列表)和時間表(到達和離開時間也可以在第一站和跨時間段以及某些工作日(工作日,週末,假日)和小時範圍(高峯時段,早晨,晚上,中午)) –