返回neo4j中最常见的路径

时间:2014-12-12 19:08:49

标签: neo4j cypher

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

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;

我现在需要扩展它以包含更长的路径。

1 个答案:

答案 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))