2

所以我想基于一个简单的协同过滤器向用户推荐帖子。过滤器应按如下方式工作

  1. 在我喜欢的帖子中找到与我最相似的前 n 个用户(我的导师组)
  2. 在这个导师组中找到我还没有喜欢的最受欢迎的帖子

所以我有第一部分,这会给我我的导师

START me=node:node_auto_index(uname = "mike")
MATCH me-[:LIKES]->posts<-[:LIKES]-mentors
RETURN person.uname, count(posts)
ORDER BY count(posts) DESC LIMIT 20;

第二部分,在这些导师中找到我还没有喜欢的最喜欢的帖子。

我将如何在 cypher 或 gremlin 中运行第二部分,如果它更有效的话。它是一个两部分的查询,我必须将一个查询结果输入另一个查询,还是可以将它全部合并到一个查询中?

4

2 回答 2

3

我认为这可能会做你想要的:

p = [] as Set
g.V('uname','mike').out('likes').aggregate(p).in('likes').groupCount.cap.transform{it.sort{-it.value}[0..19].keySet()}.scatter.out('likes').except(p).groupCount.cap.sort{-it.value}[0..4]

在哪里

g.V('uname','mike').out('likes').aggregate(p).in('likes').groupCount

在哈希图中为您提供导师组,其值是他们的权重。接下来,我们选取​​其中的前 20 个(必须通过转换对其进行排序),然后找到这些人喜欢的所有帖子,除了您喜欢的帖子。

于 2012-11-21T23:57:28.977 回答
0

您可以在http://console.neo4j.org/r/meljiv看到一个非常相似的示例,取自http://docs.neo4j.org/chunked/snapshot/cypher-cookbook-similar-favorites.html

START me=node:node_auto_index(name = "Joe")
MATCH me-[:favorite]->stuff<-[:favorite]-person
WHERE NOT(me-[:friend]-person)
RETURN person.name, count(stuff)
ORDER BY count(stuff) DESC
于 2012-11-22T09:59:46.847 回答