2013-10-21 79 views
2

我讀的Neo4j 2.0文檔即START子句是可選的,無START條款與VS. N =

的Cypher會嘗試推斷查詢起點

我已經實驗發現,

節點(*)
START user = node(*) 
MATCH (user:User)-[r:KNOWS]-(user2:User) 
RETURN user.username AS username, collect(user2.username) AS username2 

給出了相同的結果

MATCH (user:User)-[r:KNOWS]-(user2:User) 
RETURN user.username AS username, collect(user2.username) AS username2 
用於小數據集的

我的問題是:它在語義上是相同的嗎?他們總是會返回相同的結果集(我不是在談論訂單)?即使對於大數據集?跳過START保證遍歷所有節點?如果它們在語義上相同,爲什麼會有人使用node(*)

回答

4

您的查詢在語義上並不相同,但它們始終會返回相同的結果。他們將返回相同結果的原因是,在您的第一個查詢中,聲明瞭'通用節點模式'node(*),您立即在MATCH子句中用進一步的模式限制它。在第二個查詢中,您從一開始就聲明瞭這個更窄的模式,但由於兩個MATCH子句是等效的,並且在每個查詢中聲明瞭最窄的模式(並且因爲RETURN子句相同),所以兩個查詢返回相同的結果。

START子句曾經是陳述查詢的初始模式的方式,它與索引捆綁在一起。使用node(*)relationship(*)很少被推薦或使用,但該子句用於索引檢索,如START user=node:userIndex(name="Maciej Ziarko")。引入了2.0標籤和標籤索引,現在這是綁定查詢中節點的首選方法。

跳過START將不保證遍歷所有節點(或者更準確地說:綁定所有節點),但是您也不需要使用START子句來完成此操作。使用MATCH user(不限制與標籤或關係綁定user的內容),您仍然可以綁定數據庫中的每個節點。它仍然很少被推薦或有用。