2013-10-28 60 views
3

我想選擇db中沒有給定關係類型的所有節點與任何其他節點。選擇缺少某種關係類型的節點

這裏是我的數據庫結構:我有發佈事件節點的用戶節點。發佈關係更具體,存在各種類型的關係,如type1type2

我該如何快速選擇所有與事件有關係但與事件沒有關係的用戶節點。

這是我現在使用的查詢:

START u = node:users("*:*") 
MATCH (ev1)<-[r1:type1]-(u)-[r2?:type2]->(ev2) 
WHERE r2 IS NULL 
RETURN u 

的問題是R2是一個可選的關係。這使得上面的查詢非常緩慢,確認了neo4j文檔所說的內容。

如何提高查詢的速度?我能否更好地建模數據以提高性能?

謝謝! 亞歷克斯

+0

的可能重複[暗號:尋找那些沒有被特定的用戶還額定的電影(http://stackoverflow.com/questions/19543957/cypher-finding-movies-that-havent-been-評分由特定用戶) –

+0

@StefanArmbruster我在你推薦的問題中使用了答案,並且查詢響應類型增加了50%。這裏是我使用的查詢: start u = node:users('*:*') match(u) - [:type1] - >() where not(u) - [:type2] - >() 返回計數(distinct(u)) –

+0

@StefanArmbruster但是,現在我注意到我無法在「where not」結構中附加對關係/節點的引用。 IE瀏覽器。 '...在哪裏不是(u) - [r2:type2] - >(ev2)...'發出此錯誤:未知標識符'ev2'。未知標識符「r2」。任何解決方案 –

回答

4

我發現的解決方案是兩倍取決於用例。我有兩個:

  1. 查找所有具有type1類型關係但不具有type2類型關係的用戶節點。

兩個查詢可以解決這個問題,一個使用optional relationships這Neo4j的手冊警告不要使用:

START u = node:users("some query") 
MATCH (ev1)<-[r1:TYPE1]-(u)-[r2?:TYPE2]->(ev2) 
WHERE r2 IS NULL 
RETURN u 

或者使用更快的變體,它採用的模式濾除。 Docs

START u = node:users("some query") 
MATCH (ev1)<-[r1:TYPE1]-(u) 
WHERE NOT (u)-[:TYPE2]->() 
RETURN u 
  1. 查找誰擁有type1類型的關係,但沒有與具有特定屬性的節點type2類型的關係,所有的用戶節點。

    START U =節點:用戶( 「一些查詢」) MATCH(EV1)< - [R1:類型1] - (U) - [R 2:TYPE2] - >(EV2) WHERE ev2.property =值 和r2.property =值 RETURNü

鑑於我的問題有一個性能注意它,我將添加兩個建議,以加快上述查詢:

  • 指數聰明儘可能在Lucene中移動並儘可能多地移動查詢條件f從WHERE索引查詢。所有努力減少起始節點的數量!注意!大量索引會降低寫入性能。有關可用的查詢語法,請參閱lucene docs
  • 使用參數化查詢,以便neo4j可以緩存查詢的執行策略。docs
+0

@StefanArmbruster我正確嗎? –

+0

使用參數化密碼的強+1。索引交易總是爲讀取性能編寫性能。因此,「索引儘可能多」聽起來有點誤導,應該「索引儘可能聰明」,以減少潛在的啓動節點數量。 –

+0

@StefanArmbruster修改! 10倍 –