neo4j在返回路径上变慢

时间:2014-12-15 17:59:16

标签: neo4j cypher

我有一个非常简单的结构:

U1-:VISITS->P1-:VISITS->P2-:VISITS->P3-VISITS->P4...

每个VISITS关系的评分为1到10.我对以U1-开头的关系感兴趣:VISITS-&gt; P1-:VISITS-&gt; P2其中第一评级<2且第二评级为每个页面节点都有一个页面链接作为属性。之后,我对用户访问的下两页感兴趣。这应该返回一个路径列表。我对用户采用的最常用路径感兴趣,并对它们出现的次数进行排序。

例如:

U1->P1->P2
U2->P1->P2
U3->P3->P4

应该有

P1,P2  2
P3,P4  1

我的解决方案

MATCH p=(a)-[r:VISITS]->(b:Page)-[t:VISITS]->(page:Page) WHERE r.rating<2 AND t.rating>5 
WITH EXTRACT (n IN nodes(p)|n.page_id) AS my_pages,t AS rels RETURN DISTINCT(my_pages) 
AS pages,count(DISTINCT rels) as count;

这非常慢(在100万个节点上需要360733毫秒(我已经分配了足够的内存)。如果我添加另一个跃点

p=(a)-[r:VISITS]->(b:Page)-[t:VISITS]->(page:Page)-[s:VISITS]->(page:Page)

其中s.rating&gt; 5,查询永远不会完成(或者完成时间太长)。有没有办法让查询更快?或者我做错了什么?

1 个答案:

答案 0 :(得分:1)

正如@cybersam和@DaveBenett建议您为用户分配标签一样。此外,通过引入WITH语句来帮助Cypher提前终止分支可能是有意义的:

MATCH (u:User)-[r:VISITS]->(b:Page)
WHERE r.rating < 2
WITH u, b
MATCH (b)-[t:VISITS]->(page:Page)
WHERE t.rating > 5
RETURN ....