手機淘寶購物時,手淘上有猜你喜歡頁面來推薦你可能會感興趣的商品;使用優酷觀看電影時,頁面上也會推薦你可能喜歡的電影列表。個性化推薦的應用非常廣泛,幫助企業挖掘潛在的用戶需求、提高轉化率的同時,也能夠有效提升用戶體驗度。個性化推薦基于用戶的歷史行為習慣,商品、電影本身的屬性等數據集,這些數據之間相互關聯,應用推薦策略時需要利用這些數據之間復雜的關聯關系,因此使用圖數據庫來存儲這些數據是非常合適的。

建模

本文以書籍的個性化推薦舉例,來說明如何使用圖數據庫的個性化推薦應用。

圖數據庫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')))