Neo4j 圖資料庫在社交網路等領域的應用

NO IMAGE

?wx_fmt=gif&wxfrom=5&wx_lazy=1

本文來自作者 秦子敬 在 GitChat 上分享 「Neo4j 圖資料庫在社交網路等領域的應用」,「閱讀原文」檢視交流實錄。

「文末高能」

編輯 | 哈比

一、前言

Neo4j 是一種基於圖論實現的新型 NoSQL 資料庫。這種資料庫,在處理社交網路,物流運輸,推薦系統,欺詐檢測等,關係分析等領域有著巨大優勢。本場 Chat,我將為你介紹:

  1. Neo4j 與關係型、其他非關係型資料庫的優勢比較

  2. 哪些領域適合 Neo4j,哪些領域不適合

  3. Neo4j 的安裝

  4. 介紹 Cypher 查詢語言

  5. 案例實戰:

  • 銀行欺詐環分析

  • 文獻索引

  • 尋找垃圾郵箱源頭

  • 企業關係構建

  • 社交關係分析,實現一個簡單的好友推薦功能

二、正文

我想,大家對 Mysql 這種關係型(SQL 型)的資料庫肯定很熟悉。對 MongoDb 這種非關係型(NoSQL 型)資料庫也不會陌生。今天我們要介紹一種新型資料庫—圖資料庫。這種資料庫是基於圖論實現的。

一提到圖論,可能有的小夥伴就會倒吸一口冷氣,如果你曾涉及過一些資料結構的知識,會發現圖幾乎是最難學的,涉及到許多晦澀難懂的演算法。這裡不用擔心,今天介紹的 Neo4j 把很多演算法已經封裝好了。不需要你涉及底層,很方便。

下面我們開始對比一下圖資料庫和其他關係型、非關係型的資料庫的優劣。

與傳統資料庫不同的是,圖資料庫存的是節點(物件)和邊(物件與物件之間的關係)。當資料存在錯綜複雜的關係時,使用這類資料庫是最好的選擇。

?wx_fmt=png

1. Neo4j 與關係型、其他非關係型資料庫的優勢比較

(1)Neo4j 與關係型資料庫的比較

以 Mysql 為代表的關係型資料庫已經誕生了很久了,一直是資料庫領域的動力,他們將高度結構化的資料儲存在一張張二維表格裡,必須嚴格地按照相關約定對資料進行操作(比如外來鍵約束)。你可以把它理解成一張張賬本。

?wx_fmt=png

但是,正是因為關係型資料庫在建表之前就需要制定相關約定,常常會出現表與表之間有相互制約、相互引用的關係。隨著資料庫的不斷增大,相互制約的關係會不斷增多,執行搜尋匹配的操作次數將呈現指數增加,進而消耗大量的資源。

舉一個例子,當你要查詢 “小明的朋友” 這樣的問題,關係層資料庫會涉及到一些代價高昂的間接層,比如用索引表查詢:

?wx_fmt=png

從表裡可以發現,小明(ID:2)的朋友是小華(ID:1),你也許會說這並不複雜呀,才一張表而已。

但是要是我問 “小明的朋友的朋友的朋友…” 這樣的深度不斷增加,每增加一層就要加一張索引表,這樣間接層不斷增加。查詢就越來越慢,而且所需的記憶體開銷就越來越大。

還有一點,如果我反向問,“誰的朋友是小明”,你可能會說,當然是小華呀。但是你仔細看看索引表,可小華的 FriendID 是 3 不是 1(小明)。也就是說,對於這種反向提問,關係型資料庫也不能很好處理。

這種反向提問有意義嗎?當然有意義,而且很有用,打個比方,小明喜歡程式設計,那麼反向問,誰還喜歡程式設計。找到喜歡程式設計裡的大神(通過緊密度中心性等屬性評判)推薦給小明關注。這樣一個簡單的推薦功能就出來了。

對比起來,圖資料庫就有著得天獨厚的優勢,它儲存節點,節點的屬性,節點的關係。而這些關係是按型別和方向組織起來的。關係的訪問是直接通過節點完成的。問 “小明的朋友的朋友的朋友…”,即使深度增加也只是增加節點而已。在複雜連線的查詢上,能達到毫秒級別。

怎麼理解節點,關係,屬性這些概念呢?

這裡舉個例子,建立一個節點,標籤是人,他的名字叫小明。小明就是一個節點。小明喜歡看電影(節點的屬性),他和小華是朋友(關係)。這樣一個簡單的關係就建立了。

?wx_fmt=png

(2)Neo4j 與其他非關係型資料庫比較

目前,大部分的 NoSQL 資料庫都是基於集合和文件的,這些資料被儲存在不連貫的集合裡,那麼這樣使得資料間的相互聯絡,建立關係變得更加困難。也就是說資料是離散的,如果要建立關係,通常會將一個集合嵌到另一個集合裡,再來實現關係。

這樣的開銷也很大。但是,這種資料沒有太多 “ 關係 “,使用這種資料庫效率特別高,有很好的讀寫功能。

?wx_fmt=png

這篇文章對比了 8 種不同的 NoSQL 資料庫可以參考(http://blog.jobbole.com/1344/)

2. 哪些場所適合 Neo4j, 哪些場所不適合?

在這裡,需要說明一下,圖資料庫不只有 Neo4j,但是 Neo4j 是一個非常優秀的圖資料庫,03 年就開始研發了,07 年釋出。被許多公司使用,ebay, 阿迪達斯,沃爾瑪等等。

Neo4j 是基於圖論實現的,自然在處理地圖方面有天然優勢,所以,他適用於物流管理,交通大資料。

由於 Neo4j 的基本元素是節點和關係,它也特別適合處理有複雜關係的社交網路。另外在實現推薦系統上也很有優勢,對於分析交易客戶資料也很有幫助。它還能用於檢測欺詐行為。下文會用一個例子說明。甚至在遊戲方面也有運用。比如光榮公司的《三國志 13》。

?wx_fmt=jpeg

稍微總結適合的領域:

  • 社交網路

  • 交通大資料(物流)

  • 推薦系統

  • 欺詐分析

  • Web 安全(垃圾郵件等等)

但是,也有不適合圖資料庫的領域。

  • 記錄大量基於事件的資料

  • 需要大規模分散式資料處理

  • 二進位制資料儲存

  • 適合儲存在關係型資料的結構化資料

3. Neo4j 安裝

Windows 有 exe 安裝檔案,比較方便,一步一步按照視覺化教程就行。Mac 安裝應該也不難。這裡也不做介紹了。這裡為基於 Linux Ubuntu16.04,介紹安裝教程。

(1)安裝 JAVA 環境

Neo4j 是用 Java 實現的,所以你需要安裝 Java Runtime Environment(JRE)。如果您已經啟動並執行,請繼續並跳過此步驟。開啟指令框:

sudo apt update
sudp apt upgrade
sudo apt install default-jre default-jre-headless

如果指令不管用,先試試這兩句,再使用。

sudo update-alternatives —set java / usr / lib / jvm / java-8-openjdk-amd64 / bin / java
sudo update-alternatives —set javac / usr / lib / jvm / java-8 -openjdk-amd64 / bin / javac

看一下 java 版本:

?wx_fmt=png

(2)安裝 Neo4j

首先,我們將儲存庫金鑰新增到我們的鑰匙串。

wget –no-check-certificate -O -https://debian.neo4j.org/neotechnology.gpg.key| sudo apt-key add –

然後將儲存庫新增到 apt 源列表中。

echo ‘deb http://debian.neo4j.org/repo stable/’ | sudo tee /etc/apt/sources.list.d/neo4j.list

更新一下:

sudo apt update
sudo apt install neo4j

伺服器應該已經自動啟動,也應該在啟動時重新啟動。如有必要,伺服器可以停止:

sudo service neo4j stop

並重新啟動:

sudo service neo4j start

訪問 Neo4j

現在應該可以通過 http:// localhost:7474 / browser / 訪問資料庫。

下面介紹一下開啟後的面板。一開始有一個登入介面,讓你輸入帳號密碼,第一次開啟預設都是 neo4j, 進去後會自動彈出來讓你改密碼。登入後是這個樣子的。

?wx_fmt=png

這裡有一些示例程式碼:

?wx_fmt=png

你可以先嚐試一下 Example Graphs 的教程 輸入查詢語句後得到這樣的介面:

?wx_fmt=png

table 是這樣的,可以看到節點的屬性:name、born 等等。

?wx_fmt=png

Text 可以看到表格的資料:?wx_fmt=png

Code 可以看到輸入的 code 和 json 格式的資料:?wx_fmt=png

4. 介紹 Cypher 查詢語言

正如 Mysql 有 SQL 語言一樣,Neo4j 也有對應的查詢語言 Cypher。Cypher 借鑑了 SQL 語言的結構,會有許多熟悉的關鍵字。對於資料庫操作無非是增刪改查,下面一一介紹:

(1)增

所謂增,就是建立資料。在圖形資料庫裡基本元素是節點,關係,屬性。Neo4j 有兩個關鍵字實現增加。一個是 CREATE(小寫也可以):

<1> CREATE 建立節點

create (n:User {name:”Dav”})

這裡 n 是變數名,User 是標籤(在圖資料庫裡,標籤可以理解為關係型資料庫裡的表 table),花括號裡面的是屬性。

<2> CREATE 建立關係:

MATCH (n{name:”a”}),(m{name:”b”}) CREATE (n)-[r:KNOWS]->(m) return n,m

這裡做幾點說明:

  • 小括號裡是節點,節點也可以不帶標籤(不過不是好習慣),方括號裡是關係,關係的兩邊是兩個節點,
    類似這樣 ()-[]→()

  • MATCH 是查詢語句關鍵字

  • return n,m  把兩個節點返回 才能得到圖

    ?wx_fmt=png

另一個是用 MERGE 建立節點 MERGE 和 CREATE 不同之處在於 MERGE 等於 MATCH CREATE 會先建立前會在資料庫裡檢查有沒有這個節點。

<3>MERGR 建立節點

MERGE (n:Test{name:”c”}) ON CREATE SET n.created = timestamp() return n

首先檢查 Test 標籤,屬性為 name 的值的節點 c 是否存在,存在使用已有節點,否則建立一個新的節點。

這裡就用到了 MERGE 建立節點,還用了一個 SET 關鍵字,這個是改變節點的屬性,屬於 “改” 的範圍

<4>MERGR 建立關係

用合併的方式建立關係,先檢測關係存不存在,若存在則不修改任何資料,否則創造新的關係

MATCH (a:Person{name:’Joel Silver’}),(b:Person{name:’J.T. Walsh’}) MERGE (a)-[r:LOVES]->(b)

匹配出名字叫 Joel Silver 的人和名字叫 J.T. Walsh 的人建立關係 LOVES。出現這個話,代表已經建立成功了。

Created 1 relationship, completed after 199 ms.

(2) 刪

<1> DELETE 關鍵字可以刪除資料:

MATCH (n)DELETE n

這個會報錯,因為必須刪除關係才能刪除節點:

MATCH ()-[r:朋友]->(m) DELETE r,m

要這麼操作,查詢出朋友關係 r 以及朋友所指向的節點 m,並同時把 r 和 m 刪除。出現這個就成功了:

Deleted 1 node, deleted 1 relationship, completed after 8 ms.

<2> REMOVE 也可以刪除資料:

MATCH (n) REMOVE n:Test

用 REMOVE 來移除資料,移除帶有 Test 標籤的所有結點:

Removed 3 labels, completed after 9 ms.

用 REMOVE 來移除節點時要小心,REMOVE 不會像 DELETE,因為這個節點有其他關係而報錯不刪。

那麼這個節點被刪除後,關係會指向空節點。

(3)改

使用 SET 去更改節點。剛剛前文已經有例子就不贅述了。

(4)查

使用 MATCH 去查詢節點。Cypher 還有其他的縮小查詢範圍的辦法。

<1>MATCH p=()-[r:LOVES]->() RETURN p LIMIT 25

用 LIMIT 關鍵字只拿指定數目的節點個數。

<2> WHERE 實現條件過濾

MATCH p=(n:Person)-[:LOVES]->() WHERE n.name <> “a” RETURN p

查詢節點 n 的屬性 name 不等於 a 的所有節點 <> 表示不等於。

<3> 使用 INDEX 索引

使用關鍵字 INDEX ON 為節點的屬性 name 建立一個普通的索引:

CREATE INDEX ON :Person(name)

輸出:

Added 1 index, completed after 46 ms.

使用索引來查詢:

MATCH (n:Person) WHERE n.name IN [“a”,”b”] RETURN n as Person

得到圖:

?wx_fmt=png

顯式使用索引查詢:

MATCH(n:Person)
USING INDEX n:Person(name)
WHERE n.name = ‘a’
RETURN n as Person

用 DROP 關鍵字刪除一個已經存在的索引:

DROP INDEX ON :Person(name)

輸出:

Removed 1 index, completed after 1 ms.

Cypher 還能使用一些函式來輔助查詢 比如 size()、any()等等。具體其他的可以查閱相關的 API 文件。這裡只提兩個重要的,查詢最短路徑和所有最短路徑。

<1> 最短路徑 shortestpath()

以這個圖為例子,從部分的圖裡找出 Joel Silver 到 Jonathan Lipnicki 的最短路徑:

?wx_fmt=png

MATCH (p1:Person {name:”Jonathan Lipnicki”}),(p2:Person{name:”Joel
Silver”}), p=shortestpath((p1)-[*..10]-(p2)) RETURN p

這裡 [*..10] 表示路徑深度 10 以內查詢所有存在的關係中的最短路徑關係

得到圖:

?wx_fmt=png

<2> 所有最短路徑

MATCH (p1:Person {name:”Jonathan Lipnicki”}),(p2:Person{name:”Joel
Silver”}), p=allshortestpaths((p1)-[*..10]-(p2)) RETURN p

?wx_fmt=png

以上理論部分已經講完,下面進入實戰部分。

5. 案例實戰

(1)銀行欺詐環分析

這裡引入一個概念,第一方銀行欺詐,本質是使用他人真實身份編造和偽造身份進行欺詐。

有如下幾個特點:

  • <1> 兩個或兩個以上的人組成欺詐環;

  • <2> 欺詐環裡的人共享合法聯絡人的部分資訊,如電話號碼。

我們可以使用 Neo4j 來識別存在的欺詐環。

首先,我們建立欺詐環(由於篇幅限制,就不把程式碼貼在這裡,可以參考這個教程 http://blog.sina.com.cn/s/blog_735f29100102wobk.html)。

?wx_fmt=png

查詢可疑的欺詐環:

?wx_fmt=png

從左到右,欺詐環的成員,涉嫌欺詐的聯絡方式,欺詐環的大小。計算出欺詐的風險值:

?wx_fmt=png

2)文獻索引

先舉個小例子,在學術界需要查一些論文,通常是用全文搜尋,這樣的搜尋效率不高。可以用 Neo4j 獲取匹配度高的論文。這裡先舉個小例子。開啟 Neo4j, 先手動插入資料。

create
(論文 1:論文圖譜{論文名:” 論文 1”}),(論文 2:論文圖譜{論文名:” 論文 2”}),(論文 3:論文圖譜{論文名:” 論文 3”}),(論文 4:論文圖譜{論文名:” 論文 4”}),(論文 5:論文圖譜{論文名:” 論文 5”}),(論文 6:論文圖譜{論文名:” 論文 6”}),(論文 7:論文圖譜{論文名:” 論文 7”}),(論文 1)-[:相似]->(論文 2),(論文 1)-[:相似]->(論文 3),(論文 2)-[:相似]->(論文 4),(論文 2)-[:相似]->(論文 5),(論文 3)-[:相似]->(論文 5),(論文 5)-[:相似]->(論文 6),(論文 7)-[:相似]->(論文 2),(論文 7)-[:相似]->(論文 6) return *

?wx_fmt=png

查詢論文 1 到論文 6 之間相似的傳遞路徑,這樣就可以找出,論文的主要參考了那些論文。

MATCH n=allshortestPaths((論文 1:論文圖譜{論文名:” 論文 1″})-[*..6]->(論文 6:論文圖譜{論文名:” 論文 6″})) RETURN n

?wx_fmt=png

接下來,我想通過一個完整的例子實現文獻索引,從資料獲取,匯入,再到分析。我將使用 Scrapy 爬取 1000 本書的資訊。儲存到 csv,匯入 neo4j,再進一步分析。

首先是使用 Scrapy 爬取資訊。資料爬下來後,是這樣。

?wx_fmt=png

從左到右依次是書的 upc 編碼,名字,型別,儲存量,價格,評分,評分數目,簡介目標網站是 http://books.toscrape.com/。先使用 scrapy shell 來操作一個爬蟲,先簡單進行爬取實驗,把網頁分析好。

?wx_fmt=png

scrapy shell http://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html

設計思路:

  • <1> 根據剛剛分析出來的網頁資訊,設定 items

  • <2> 根據剛剛分析的網頁,設計爬蟲 spieder

    • 爬蟲需要爬去單個頁面需要資訊

    • 爬完一個網頁,爬蟲需要去爬取下一個目標網頁

  • <3> 在 setting 裡設定相關資訊

  • <4> 在 pipelines 處理特別的資料

程式碼我已經上傳到 git(https://coding.net/u/Qinxianshen/p/python-spider/git)。

通過 csv 檔案,把資料匯入 Neo4j。首先把 book2.csv 放到這個目錄下:

/var/lib/neo4j/import

首先讀取一下檔案,看看是否能獲取到:

LOAD CSV WITH HEADERS FROM “file:///books2.csv” AS line WITH line RETURN line

?wx_fmt=png

LOAD CSV WITH HEADERS FROM “file:///books2.csv” AS line CREATE (:Books { Id: line.upc, Name: line.name, Price: line.price,Rate:line.review_rating,content:line.jianjie,kinds:line.Kinds,stock:line.stock})

這樣就把 1000 本書作為節點,存進去了。輸出:

Added 1000 labels, created 1000 nodes, set 5998 properties, completed after 228 ms.

查詢 25 個看看情況:

?wx_fmt=png

並且可以檢視到各種屬性。但是還沒有關係。在建立幾個書類節點:

create (n:書類名{n.Name=”Sequential Art”})
..
..

再建立關係:

MATCH (n:Books2),(m:書類名) where n.kinds = m.Name create(n)-[r:屬於]->(m) RETURN n,r,m LIMIT 25

?wx_fmt=png

一個簡單的書籍-門類圖就建好了,現在我們可以通過書的評分,門類,價格進行索引。從而完成一個簡單的書目推薦系統。在第五個案例我會合在一起做。

(3)尋找垃圾郵箱源頭

如果你不想在本地下載 Neo4j,可以去可以登入微雲數聚公司官網 線上嘗試一下 Neo4j。這裡我們就基於這個平臺,來做一個垃圾郵件的案例。

在命令框輸入:

MATCH m=(s:Person)–>(e:Email)–>(r:Person) WHERE e.title=~’.* 普通發票 .*’ RETURN m LIMIT 15

?wx_fmt=png

這裡只返回了 15 個節點。如果我們要查到垃圾郵箱的源頭,會怎麼做?通常垃圾郵箱的標題或者內容會有關於促銷,招聘等等字眼。

這裡我們就通過對所有郵件的標題遍歷,查詢關鍵字 “發票”。如果經常發這種郵件的人,郵件數量一定很多。這裡我們設定當有這種信件的數量超過 105,就輸出他。

MATCH m=(s:Person)→(e:Email)→(r:Person)
WHERE e.title=~’. 發票 .
WITH s,COUNT(e) AS num,COLLECT(e) AS emails,COLLECT(r) AS recevies
WHERE num > 105
RETURN s,emails,recevies

得到圖:

?wx_fmt=png

很明顯就發現,幾乎所有發票都是來自這個郵箱 [email protected], 主犯找到了。

那麼就可以發現這個主犯了。那麼這樣就結束了嗎?不不,我在上文說過 “反向提問” 是很有價值的,既然找到了主犯,那麼我們不妨多看看,

他還會經常發什麼郵件,這類郵件有什麼特徵。從中挖掘出這類人,發垃圾郵箱的 “套路”。

MATCH m=(s:Person)→(e:Email)→(r:Person)

WHERE s.account=~’[email protected]

RETURN s,e,r

得到圖:

?wx_fmt=png

仔細觀察,你會發現,這個主犯的郵件除了含 “發票” 的字眼,還有 “來電恰談”,“費用優惠” 等字眼。那麼這樣我們就可以記住這樣的字眼,下次就可以過濾這類字眼的郵件。

通過上面這個例子,應該能體會到,圖資料庫,在處理垃圾郵件,查詢資訊的優勢了。特別是在處理 “反向提問” 的問題。並且查詢效率都是在毫秒級別的。

4)企業關係構建

這裡還是基於微雲數聚公司的平臺。

MATCH (n:`公司`) RETURN n LIMIT 25

?wx_fmt=png

投資圖:

MATCH a=(:公司 {名稱:’ 中航工業集團公司 ‘})-[r*]->() RETURN nodes(a)

?wx_fmt=png

這樣對於公司就有一個直觀的把握。誰投資了誰,現金流的流向。對於公司的財務管理也有直觀的展現。

擔保圖:

MATCH a=(:公司 {名稱:’ 中航工業集團公司 ‘})-[r:擔保 *]->() RETURN nodes(a)

?wx_fmt=png

(5)社交關係分析,實現一個簡單的好友推薦功能

這裡我們會用到第二個案例的書籍庫,首先建立好友圈。

create (小北:朋友圈{姓名:” 小北 “, 喜歡的書類:”Poetry”}),
(小菲:朋友圈{姓名:” 小菲 “, 喜歡的書類:”Science Fiction”}),
(小鵬:朋友圈{姓名:” 小鵬 “, 喜歡的書類:”Music”}),
(小穎:朋友圈{姓名:” 小穎 “, 喜歡的書類:”Politics”}),
(小蘭:朋友圈{姓名:” 小蘭 “, 喜歡的書類:”Music”}),
(小峰:朋友圈{姓名:” 小峰 “, 喜歡的書類:”Travel”}),
(小訊:朋友圈{姓名:” 小訊 “, 喜歡的書類:”Poetry”}),
(小東:朋友圈{姓名:” 小東 “, 喜歡的書類:”Sequential Art”}),
(小唯:朋友圈{姓名:” 小唯 “, 喜歡的書類:”Young Adult”}),
(小竇:朋友圈{姓名:” 小竇 “, 喜歡的書類:”Poetry”}),
(小齊:朋友圈{姓名:” 小齊 “, 喜歡的書類:”Default”}),
(小林:朋友圈{姓名:” 小林 “, 喜歡的書類:”Poetry”}),
(小銳:朋友圈{姓名:” 小銳 “, 喜歡的書類:”Default”}),
(小偉:朋友圈{姓名:” 小偉 “, 喜歡的書類:”Young Adult”}),
(小玲:朋友圈{姓名:” 小玲 “, 喜歡的書類:”Business”}),
(小訊)-[:認識]->(小竇),
(小訊)-[:認識]->(小齊),
(小訊)-[:認識]->(小林),
(小訊)-[:認識]->(小鵬),
(小訊)-[:認識]->(小偉),
(小訊)-[:認識]->(小峰),
(小菲)-[:認識]->(小鵬),
(小菲)-[:認識]->(小峰),
(小菲)-[:認識]->(小唯),
(小峰)-[:認識]->(小北),
(小峰)-[:認識]->(小蘭),
(小東)-[:認識]->(小林),
(小東)-[:認識]->(小銳),
(小東)-[:認識]->(小菲),
(小鵬)-[:認識]->(小穎),
(小北)-[:認識]->(小蘭),
(小穎)-[:認識]->(小東),
(小唯)-[:認識]->(小鵬),
(小唯)-[:認識]->(小銳),
(小偉)-[:認識]→(小玲)

展現小峰的朋友圈:

MATCH n=(:朋友圈{姓名:” 小峰 “})-[*..6]-() return n

?wx_fmt=png

這裡要引入幾個概念。

<1> 一度關係(直接關係)

MATCH n=(:朋友圈{姓名:” 小訊 “})-[:認識]-() return n

?wx_fmt=png

<2> 二度關係

MATCH n=(:朋友圈{姓名:” 小訊 “})-[*..2]-() return n

?wx_fmt=png

我曾經看到一個問題,如果你住在一個村子,要認識奧巴馬,要經過幾個人呢?答案是 6 個。假設你在一個村裡,那麼村長,鄉長,縣長,市長,省長,國家主席,奧巴馬,通過六個人就可以了。所以你會發現,我們通常在 6 度深度搜尋。

<3> 兩個陌生人之間的最短認識路徑

我們可以用 Neo4j 來找到兩個不認識的人,建立聯絡的最短路徑。

MATCH n=shortestPath((小訊:朋友圈{姓名:” 小訊 “})-[*..6]-(小銳:朋友圈{姓名:” 小銳 “})) return n

?wx_fmt=png

<4> 兩個陌生人之間的所有最短認識路徑

MATCH n = allshortestPaths((小訊:朋友圈{姓名:” 小訊 “})-[*..6]-(小菲:朋友圈{姓名:” 小菲 “})) return n

?wx_fmt=png

<5> 根據節點的影響力或者及其它屬性來製作推薦系統

不知道,大家有沒有思考過,B 站、淘寶,QQ 等等這些軟體是怎麼作推薦系統的。比如:B 站,每一個 Up 主在上傳視訊的時候都要選好投稿區,型別,關鍵字標籤。這樣就已經完成了資料的分類。

你如果經常看官延區,那麼你來官延區的頻度一定很大,那麼可以給你推薦這些視訊,再根據 Up 主的影響力(節點的大小)來給你推薦。當然他們肯定還使用了許多機器學習的演算法。在我看來,也可以使用 Neo4j 做一個簡單的推薦功能。

比如做一個小小的書籍推薦。在建立節點的時候,我順便建立了他們喜歡的書的型別(你會發現,你用一些 app 時,你一件事就是讓你確定喜好)。

結合第二個案例的資料:

MATCH (n:朋友圈),(m:Books2) where n. 喜歡的書類 = m.kinds and toInt(m.Rate)>4  create (m)-[r:推薦]->(n) return m,r,n

這裡我們做了一件事,就是根據大家填上來的喜好書籍型別,我們挑選出評分大於 4 的書籍給他們。

?wx_fmt=png

並且從圖中可以很容易發現,越是推薦書籍密集的相近的人,他們就具有相同的愛好。比如小齊和小銳,從圖中還能發現,兩個人並不是直接認識的。根據這一點,我們就可以介紹小銳和小齊認識交流。

由此,我們完成了兩層推薦。一個是書籍的推薦,一個是朋友的推薦。但是,實際運用中肯定不會這麼草率和簡單,考慮的肯定會更加詳細。這裡只是做一個簡單的拋磚引玉。

三、推薦資料:

在學習 Neo4j 的過程中,我也找了不少資料。這裡也供大家參考。

  • 《Neo4j 權威指南》—清華大學出版社

  • 《Neo4j 全棧開發》—電子工業出版社

  • 《圖資料庫》—人民郵電出版社

  • 《精通 Scrapy 網路爬蟲》—清華大學出版社

  • Neo4j 官方文件(http://neo4j.com/docs/stable/tutorials.html)

四、寫在最後的話

Neo4j 確實是一個很好的資料庫,雖然現在還沒火起來,但是我相信,未來它的應用場景會越來越多的。畢竟畫圖是我們人類認識世界最直觀的方式了。

非常非常感謝大家能來參加這場 Chat。這是我做的第二場 Chat,雖然已經有第一次的經驗了。但是說實在話,還是很緊張。畢竟我還是一名學生,做的東西肯定會有不少疏忽和錯漏,還請大家諒解。

有什麼疑問都可以在評論區留言。這對我也是一次很好的歷練與成長。最後感謝各位的支援。感激不盡。

秦子敬  17 年 12 月 16 日

近期熱文

從零開始,搭建 AI 音箱 Alexa 語音服務

修改訂單金額!?0.01 元購買 iPhoneX?| Web談邏輯漏洞

讓你一場 Chat 學會 Git

介面測試工具 Postman 使用實踐

如何基於 Redis 構建應用程式元件

深度學習在攝影技術中的應用與發展


?wx_fmt=jpeg

「閱讀原文」看交流實錄,你想知道的都在這裡