2015-01-26 111 views
2

我有一種城市地圖,其中節點是十字形,弧形是街道。我幾乎隨機地在一些街道上添加了一個屬性「障礙物」。現在我想找到一些從一個點到另一個點的路徑,而無需在此路徑中使用此屬性的任何街道。可能嗎?neo4j,如何在所有最短路徑算法中排除一些路徑

這是我寫的代碼和問題是條款中「street.obstacle不爲空」

MATCH path=allShortestPaths((source:Cross)-[street:Street*]->(destination: Cross)) 
WHERE source.id="49" AND destination.id="57" AND 
     street.obstacle IS NOT NULL 
return path AS shortestPath, 
     reduce(LENGTH=0, n IN rels(path)| LENGTH + n.length) AS totalLength 
+0

由於@frobberofbits表示'has'或'exists',但你也可以嘗試NOT(street.obstacle IS NULL)。 – 2015-01-26 22:54:27

+0

我會用'不是'有(street.obstacle)' – 2015-01-31 11:43:55

回答

2

空並不適用於某些布爾條件。 Read more in the docs here。表達式(NOT NULL)返回NULL,而不是false,因爲null被視爲第三個選項,既不是真也不是false。這是真的沒有數據。

您可能正在尋找has(street.obstacle)而不是EXISTS()函數,具體取決於您要表達的內容。是否會告訴你該屬性是否存在(不管它有什麼價值)。

+0

是的,我以前看過,障礙物的價值並不重要。順便說一句,(street.obstacle)不起作用,因爲街道不僅是一個。我試圖更好地解釋。我有一個 - [r] - > b和r是由十字(節點)和街道(邊緣)組成的路徑。我怎樣才能找到沒有任何屬性障礙的街道? – 2015-01-26 22:54:38

+0

@FrobberOfBits我在性能問題上感到奇怪,在預先用WHERE子句過濾路徑或僅讓allShortestPaths執行他的工作並使用FILTER過濾結果的區別。這是在我的待辦事項列表中進行測試:) – 2015-01-26 23:58:42

+0

@ChristopheWillemsen通過使用「PROFILE」關鍵字,您可以通過兩種方式嘗試找到答案。 http://www.kennybastani.com/2014/07/understanding-how-neo4j-cypher-queries.html – FrobberOfBits 2015-01-27 13:10:11