我有一个非常简单的结构:
U1-:VISITS->P1-:VISITS->P2-:VISITS->P3-VISITS->P4...
每个VISITS关系的等级从1到10。我对以U1-:VISITS-> P1-:VISITS-> P2开头的关系感兴趣,其中第一等级为<2,第二等级大于5。每页节点具有页面链接作为属性。之后,我对用户访问的接下来的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-> p1-> 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;
我现在需要扩展它以包括更长的路径。
我注意到的第一件事(它只是一个转录错误),关系上没有方向。而且,您没有使用标签,因此可以在路径的任何子部分进行匹配。这可能会更好:
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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句