我有一个非常简单的结构:
U1-:VISITS->P1-:VISITS->P2-:VISITS->P3-VISITS->P4...
每个VISITS关系的评分为1到10.我对以U1-开头的关系感兴趣:VISITS-&gt; P1-:VISITS-&gt; P2其中第一评级<2且第二评级为每个页面节点都有一个页面链接作为属性。之后,我对用户访问的下两页感兴趣。这应该返回一个路径列表。我对用户采用的最常用路径感兴趣,并对它们出现的次数进行排序。我的查询未返回正确的路径计数。我做错了什么?
MATCH p=(a)-[r:VISITS]-(b)-[t:VISITS]-(c)-[q*1..2]-(page:Page) WHERE r.rating<2 AND t.rating>5 RETURN EXTRACT (n IN nodes(p)|n.page_id) ,count(p) ORDER BY count(p) DESC;
例如:
U1->P1->P2
U2->P1->P2
U3->P3->P4
应该有
P1,P2 2
P3,P4 1
作为最终结果。
编辑:这是我的解决方案,它返回上述问题的正确结果(u-&gt; p1-&gt; p2):
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;
我现在需要扩展它以包含更长的路径。
答案 0 :(得分:2)
我注意到的第一件事(它只是一个转录错误,是关系上没有方向。而且,你没有使用标签,所以你可以匹配任何子部分路径。这可能会更好:
MATCH p=(a:User)-[r:VISITS]->(b:Page)-[t:VISITS]->(c:Page)-[q*1..2]->(page:Page)
WHERE r.rating<2 AND t.rating>5
RETURN EXTRACT (n IN nodes(p)|n.page_id) ,count(p)
ORDER BY count(p) DESC;
如果您没有标签,也可以添加WHERE NOT(()-[:VISITS]->(a))