[英]Optimizing Cypher Query - Neo4j
我有以下查詢
匹配(User1)-[:VIEWED]->(頁面)<-[:VIEWED]-(User2)
返回User1.userId,User2.userId,count(page)作為cnt
它是一個相對簡單的查詢,用於查找用戶之間的頁面瀏覽量。 它太慢了,我必須在一段時間后終止它。
用戶包括大約15萬個節點頁面包含大約18萬個節點
用戶-VIEWS->頁面具有約380k關系
用戶具有7個屬性,而Page具有大約5個屬性。
用戶和頁面都分別在UserId和PageId上建立索引。
堆大小為512mb(也嘗試在1g上運行)
由於我認為節點和關系的數量不是很多,因此有什么方法可以優化此查詢。
使用標簽
始終在模式中使用Node標簽 。
MATCH (u1:User)-[:VIEWED]->(p:Page)<-[:VIEWED]-(u2:User)
RETURN u1.userId, u2.userId, count(p) AS cnt;
在重復的用戶對上不匹配
該查詢將對所有對(共享一個查看頁面)的用戶對執行兩次。 每個用戶將被映射到User1
,然后每個用戶還將被映射到User2
。 要限制此:
MATCH (u1:User)-[:VIEWED]->(p:Page)<-[:VIEWED]-(u2:User)
WHERE id(u1) > id(u2)
RETURN u1.userId, u2.userId, count(p) AS cnt;
查詢特定用戶
如果您可以綁定模式的任何一側,查詢將更快。 您是否需要對所有用戶對執行此查詢? 僅相對於單個用戶執行它是否有意義? 例如:
MATCH (u1:User {name: "Bob"})-[:VIEWED]->(p:Page)<-[:VIEWED]-(u2:User)
WHERE NOT u1=u2
RETURN u1.userId, u2.userId, count(p) AS cnt;
在嘗試其他查詢時,可以在EXP查詢前添加EXPLAIN
或PROFILE
以查看執行計划和數據命中數。 更多信息在這里。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.