2015-09-24 67 views
0

我有一個數據模型,我想在發佈在Graphgist中的文章後進行粗略建模。Neo4j - 在WHERE子句中查找邊緣屬性的性能

我很好奇我在WHERE子句中可以期待的性能,即給定的2個節點之間有大量的關係,每個節點之間定義了'from'和'to'參數邊緣。當你做一個匹配查詢這樣的,你必須讓我們說100的價格賣出的關係,如何做的Neo4j處理過濾下來的邊緣,只是此事基礎上,WHERE條件的一個(或多個)的性能:

MATCH (s:Shop{shop_id:1})-[r1:SELLS]->(p:Product) 
WHERE (r1.from <= 1391558400000 AND r1.to > 1391558400000) 
MATCH (p)-[r2:STATE]->(ps:ProductState) 
WHERE (r2.from <= 1391558400000 AND r2.to > 1391558400000) 
RETURN p.product_id AS productId, 
    ps.name AS product, 
    ps.price AS price 
ORDER BY price DESC 

我還沒有找到一種方法直接在邊上索引屬性,所以我假設查詢優化器可以處理這樣的事情,或者它只是從字面上遍歷邊的數組並找到匹配的一個或多個。

回答

1

Neo4j只會遍歷所有關係並讀取屬性值。默認情況下,關係屬性沒有索引(這可以通過遺留索引來實現:檢查文檔)。

關於性能,請記住,Neo4j在遍歷關係時速度非常快,所以當您的查詢「非常昂貴」時,根據您的硬件配置,Neo4j可以每秒和每個核心遍歷2至400萬個關係。總而言之,對於100個關係來說,它將像閃光燈一樣運行,但目前它並未得到優化,因此,如果您需要在100萬個關係上運行相同的操作,則會看到一些缺點。

+0

這很有道理。感謝您的回覆,我們將繼續按計劃進行。該屬性是一個時間戳,所以它通常沒有意義的索引,但我想知道在遍歷中是否會有任何主要的好處,但它聽起來像有沒有什麼可以獲得。感謝幫助! – Micah