我有一个非常简单的结构:
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,查询永远不会完成(或者完成时间太长)。有没有办法让查询更快?或者我做错了什么?
答案 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 ....