如何使用neo4j和cypher或gremlin创建一个简单的协作过滤器

时间:2012-11-21 18:32:32

标签: neo4j cypher gremlin

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

  1. 在我喜欢的帖子中找到与我最相似的前n位用户(我的导师小组)
  2. 查找我尚未喜欢的导师组中最受欢迎的帖子
  3. 所以我有第一部分,这会给我我的导师

    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。它是一个2部分查询,我必须将一个查询结果提供给另一个,或者我可以将它们全部合并到一个查询中吗?

2 个答案:

答案 0 :(得分: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名(必须通过转换对它们进行排序),然后找到那些人喜欢的所有帖子,除了你喜欢的帖子。

答案 1 :(得分: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