手机淘宝购物时,手淘上有猜你喜欢页面来推荐你可能会感兴趣的商品;使用优酷观看电影时,页面上也会推荐你可能喜欢的电影列表。个性化推荐的应用非常广泛,帮助企业挖掘潜在的用户需求、提高转化率的同时,也能够有效提升用户体验度。个性化推荐基于用户的历史行为习惯,商品、电影本身的属性等数据集,这些数据之间相互关联,应用推荐策略时需要利用这些数据之间复杂的关联关系,因此使用图数据库来存储这些数据是非常合适的。

建模

本文以书籍的个性化推荐举例,来说明如何使用图数据库的个性化推荐应用。

图数据库GDB目前支持的图模型是属性图,属性图将存储的基本元素分为点(Vertex)、边(Edge)和属性(Property),每个Vertex或Edge都有一个标签(Label)来代表它的类型。在书籍个性化推荐中,我们可以定义如下的基本元素:
  • Vertex:书籍(Book)、出版商(Publisher)、作者(Author)、读者(Reader)。
  • Edge:出版(Publish)、写作(Write)、打分(Score)。
  • Property:名字(name)、类型(type)、年龄(age)、出版年份(year)。

代码实现

现在请您给用户名为“小明”的读者推荐书籍,直观想法是“找到那些和小明评价过相同的书的读者,把他们评价过的其它书推荐给小明”。

图数据库GDB目前支持的查询语言是Gremlin,下面使用Gremlin语句来实现:

  1. 找到小明。
    g.V().hasLabel('Reader').has('name','小明')
  2. 找到小明评价过的书。
    g.V().hasLabel('Reader').has('name','小明').as('myself').out('Score')
  3. 找到跟小明评价过相同书籍的其他人。
    g.V().hasLabel('Reader').has('name','小明').as('myself').out('Score').aggregate('scored_books').in('Score').where(neq('myself'))
  4. 找到这些人看过的小明没有看过的书。
    g.V().hasLabel('Reader').has('name','小明').as('myself').out('Score').aggregate('scored_books').in('Score').where(neq('myself')).out('Score').where(not(within('scored_books')))