簡體   English   中英

優化密碼查詢-Neo4j

[英]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查詢前添加EXPLAINPROFILE以查看執行計划和數據命中數。 更多信息在這里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM