手機(jī)淘寶購(gòu)物時(shí),手淘上有猜你喜歡頁面來推薦你可能會(huì)感興趣的商品;使用優(yōu)酷觀看電影時(shí),頁面上也會(huì)推薦你可能喜歡的電影列表。個(gè)性化推薦的應(yīng)用非常廣泛,幫助企業(yè)挖掘潛在的用戶需求、提高轉(zhuǎn)化率的同時(shí),也能夠有效提升用戶體驗(yàn)度。個(gè)性化推薦基于用戶的歷史行為習(xí)慣,商品、電影本身的屬性等數(shù)據(jù)集,這些數(shù)據(jù)之間相互關(guān)聯(lián),應(yīng)用推薦策略時(shí)需要利用這些數(shù)據(jù)之間復(fù)雜的關(guān)聯(lián)關(guān)系,因此使用圖數(shù)據(jù)庫(kù)來存儲(chǔ)這些數(shù)據(jù)是非常合適的。

建模

本文以書籍的個(gè)性化推薦舉例,來說明如何使用圖數(shù)據(jù)庫(kù)的個(gè)性化推薦應(yīng)用。

圖數(shù)據(jù)庫(kù)GDB目前支持的圖模型是屬性圖,屬性圖將存儲(chǔ)的基本元素分為點(diǎn)(Vertex)、邊(Edge)和屬性(Property),每個(gè)Vertex或Edge都有一個(gè)標(biāo)簽(Label)來代表它的類型。在書籍個(gè)性化推薦中,我們可以定義如下的基本元素:
  • Vertex:書籍(Book)、出版商(Publisher)、作者(Author)、讀者(Reader)。
  • Edge:出版(Publish)、寫作(Write)、打分(Score)。
  • Property:名字(name)、類型(type)、年齡(age)、出版年份(year)。

代碼實(shí)現(xiàn)

現(xiàn)在請(qǐng)您給用戶名為“小明”的讀者推薦書籍,直觀想法是“找到那些和小明評(píng)價(jià)過相同的書的讀者,把他們?cè)u(píng)價(jià)過的其它書推薦給小明”。

圖數(shù)據(jù)庫(kù)GDB目前支持的查詢語言是Gremlin,下面使用Gremlin語句來實(shí)現(xiàn):

  1. 找到小明。
    g.V().hasLabel('Reader').has('name','小明')
  2. 找到小明評(píng)價(jià)過的書。
    g.V().hasLabel('Reader').has('name','小明').as('myself').out('Score')
  3. 找到跟小明評(píng)價(jià)過相同書籍的其他人。
    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')))