[英]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.