參考datawhale開源組織:https://github.com/datawhalechina/team-learning-nlp/blob/master/KnowledgeGraph_Basic/task01.md
一、知識(shí)圖譜簡(jiǎn)介
后期會(huì)一直更新遇到的坑,關(guān)于mac的會(huì)在后期更入
1.1 引言
從一開始的Google搜索,到現(xiàn)在的聊天機(jī)器人、大數(shù)據(jù)風(fēng)控、證券投資、智能醫(yī)療、自適應(yīng)教育、推薦系統(tǒng),無一不跟知識(shí)圖譜相關(guān)。它在技術(shù)領(lǐng)域的熱度也在逐年上升。
早在 2010 年微軟就開始構(gòu)建知識(shí)圖譜,包括 Satori 和 Probase;2012 年,Google 正式發(fā)布了 Google Knowledge Graph,現(xiàn)在規(guī)模已超 700 億。目前微軟和 Google 擁有全世界最大的通用知識(shí)圖譜,F(xiàn)acebook 擁有全世界最大的社交知識(shí)圖譜,而阿里巴巴和亞馬遜則分別構(gòu)建了商品知識(shí)圖譜。


本章以通俗易懂的方式來講解知識(shí)圖譜相關(guān)的知識(shí)、介紹從零開始搭建知識(shí)圖譜過程當(dāng)中需要經(jīng)歷的步驟以及每個(gè)階段。本次組隊(duì)學(xué)習(xí)還將動(dòng)手實(shí)踐一個(gè)關(guān)于kg在智能問答中的應(yīng)用。
1.2 什么是知識(shí)圖譜呢?
知識(shí)圖譜是由 Google 公司在 2012 年提出來的一個(gè)新的概念。從學(xué)術(shù)的角度,我們可以對(duì)知識(shí)圖譜給一個(gè)這樣的定義:“知識(shí)圖譜本質(zhì)上是語義網(wǎng)絡(luò)(Semantic Network)的知識(shí)庫”。但這有點(diǎn)抽象,所以換個(gè)角度,從實(shí)際應(yīng)用的角度出發(fā)其實(shí)可以簡(jiǎn)單地把知識(shí)圖譜理解成多關(guān)系圖(Multi-relational Graph)。
1.2.1 什么是圖(Graph)呢?
圖(Graph)是由節(jié)點(diǎn)(Vertex)和邊(Edge)來構(gòu)成,多關(guān)系圖一般包含多種類型的節(jié)點(diǎn)和多種類型的邊。實(shí)體(節(jié)點(diǎn))指的是現(xiàn)實(shí)世界中的事物比如人、地名、概念、藥物、公司等,關(guān)系(邊)則用來表達(dá)不同實(shí)體之間的某種聯(lián)系,比如人-“居住在”-北京、張三和李四是“朋友”、邏輯回歸是深度學(xué)習(xí)的“先導(dǎo)知識(shí)”等等。

1.2.2 什么是 Schema 呢?
知識(shí)圖譜另外一個(gè)很重要的概念是 Schema:
介紹:限定待加入知識(shí)圖譜數(shù)據(jù)的格式;相當(dāng)于某個(gè)領(lǐng)域內(nèi)的數(shù)據(jù)模型,包含了該領(lǐng)域內(nèi)有意義的概念類型以及這些類型的屬性
作用:規(guī)范結(jié)構(gòu)化數(shù)據(jù)的表達(dá),一條數(shù)據(jù)必須滿足Schema預(yù)先定義好的實(shí)體對(duì)象及其類型,才被允許更新到知識(shí)圖譜中, 一圖勝千言
圖中的DataType限定了知識(shí)圖譜節(jié)點(diǎn)值的類型為文本、日期、數(shù)字(浮點(diǎn)型與整型)
圖中的Thing限定了節(jié)點(diǎn)的類型及其屬性(即圖1-1中的邊)
舉例說明:基于下圖Schema構(gòu)建的知識(shí)圖譜中僅可含作品、地方組織、人物;其中作品的屬性為電影與音樂、地方組織的屬性為當(dāng)?shù)氐纳虡I(yè)(eg:飯店、俱樂部等)、人物的屬性為歌手
tips:本次組隊(duì)學(xué)習(xí)不涉及schema的構(gòu)建

1.3 知識(shí)圖譜的價(jià)值在哪呢?
從圖5中可以看出,知識(shí)圖譜是人工智能很重要的一個(gè)分支, 人工智能的目標(biāo)為了讓機(jī)器具備像人一樣理性思考及做事的能力 -> 在符號(hào)主義的引領(lǐng)下,知識(shí)工程(核心內(nèi)容即建設(shè)專家系統(tǒng))取得了突破性的進(jìn)展 -> 在整個(gè)知識(shí)工程的分支下,知識(shí)表示是一個(gè)非常重要的任務(wù) -> 而知識(shí)圖譜又恰恰是知識(shí)表示的重要一環(huán)

二、怎么構(gòu)建知識(shí)圖譜呢?
2.1 知識(shí)圖譜的數(shù)據(jù)來源于哪里?
知識(shí)圖譜的構(gòu)建是后續(xù)應(yīng)用的基礎(chǔ),而且構(gòu)建的前提是需要把數(shù)據(jù)從不同的數(shù)據(jù)源中抽取出來。對(duì)于垂直領(lǐng)域的知識(shí)圖譜來說,它們的數(shù)據(jù)源主要來自兩種渠道:
- 第一種:業(yè)務(wù)本身的數(shù)據(jù)。這部分?jǐn)?shù)據(jù)通常包含在公司內(nèi)的數(shù)據(jù)庫表并以結(jié)構(gòu)化的方式存儲(chǔ),一般只需要簡(jiǎn)單預(yù)處理即可以作為后續(xù)AI系統(tǒng)的輸入;
-
第二種:網(wǎng)絡(luò)上公開、抓取的數(shù)據(jù)。這些數(shù)據(jù)通常是以網(wǎng)頁的形式存在所以是非結(jié)構(gòu)化的數(shù)據(jù),一般需要借助于自然語言處理等技術(shù)來提取出結(jié)構(gòu)化信息。
image.png
比如在下面的搜索例子里,Bill Gates和Malinda Gate的關(guān)系就可以從非結(jié)構(gòu)化數(shù)據(jù)中提煉出來,比如維基百科等數(shù)據(jù)源。

2.2 信息抽取的難點(diǎn)在哪里?
信息抽取的難點(diǎn)在于處理非結(jié)構(gòu)化數(shù)據(jù)。在下面的圖中,我們給出了一個(gè)實(shí)例。左邊是一段非結(jié)構(gòu)化的英文文本,右邊是從這些文本中抽取出來的實(shí)體和關(guān)系。

2.3 構(gòu)建知識(shí)圖譜所涉及的技術(shù)?
在構(gòu)建類似的圖譜過程當(dāng)中,主要涉及以下幾個(gè)方面的自然語言處理技術(shù):
實(shí)體命名識(shí)別(Name Entity Recognition)
關(guān)系抽?。≧elation Extraction)
實(shí)體統(tǒng)一(Entity Resolution)
指代消解(Coreference Resolution)
2.4、知識(shí)圖譜的具體構(gòu)建技術(shù)是什么?
下面針對(duì)每一項(xiàng)技術(shù)解決的問題做簡(jiǎn)單的描述,至于這些是具體怎么實(shí)現(xiàn)的,不在這里一一展開,后續(xù)課程和知識(shí)圖譜第二期的課程將會(huì)慢慢展開:

2.4.1 實(shí)體命名識(shí)別(Named Entity Recognition)
- 實(shí)體命名識(shí)別(英語:Named Entity Recognition),簡(jiǎn)稱NER
- 目標(biāo):就是從文本里提取出實(shí)體并對(duì)每個(gè)實(shí)體做分類/打標(biāo)簽;
- 舉例說明:比如從上述文本里,我們可以提取出實(shí)體-“NYC”,并標(biāo)記實(shí)體類型為 “Location”;我們也可以從中提取出“Virgil's BBQ”,并標(biāo)記實(shí)體類型為“Restarant”。
- 這種過程稱之為實(shí)體命名識(shí)別,這是一項(xiàng)相對(duì)比較成熟的技術(shù),有一些現(xiàn)成的工具可以用來做這件事情。
2.4.2 關(guān)系抽?。≧elation Extraction)
- 關(guān)系抽?。ㄓ⒄Z:Relation Extraction),簡(jiǎn)稱 RE
- 介紹:通過關(guān)系抽取技術(shù),把實(shí)體間的關(guān)系從文本中提取出來;
- 舉例說明:比如實(shí)體“hotel”和“Hilton property”之間的關(guān)系為“in”;“hotel”和“Time Square”的關(guān)系為“near”等等。

2.4.3 實(shí)體統(tǒng)一(Entity Resolution)
- 實(shí)體統(tǒng)一(英語:Entity Resolution),簡(jiǎn)稱 ER
- 介紹:對(duì)于有些實(shí)體寫法上不一樣,但其實(shí)是指向同一個(gè)實(shí)體;
- 舉例說明:比如“NYC”和“New York”表面上是不同的字符串,但其實(shí)指的都是紐約這個(gè)城市,需要合并。
- 價(jià)值:實(shí)體統(tǒng)一不僅可以減少實(shí)體的種類,也可以降低圖譜的稀疏性(Sparsity);
2.4.4 指代消解(Disambiguation)
- 指代消解(英語:Disambiguation)
-
介紹:文本中出現(xiàn)的“it”, “he”, “she”這些詞到底指向哪個(gè)實(shí)體,比如在本文里兩個(gè)被標(biāo)記出來的“it”都指向“hotel”這個(gè)實(shí)體。
image.png
-
三、知識(shí)圖譜的存儲(chǔ)
知識(shí)圖譜主要有兩種存儲(chǔ)方式:
一種是基于RDF的存儲(chǔ);
另一種是基于圖數(shù)據(jù)庫的存儲(chǔ)。
它們之間的區(qū)別如下圖所示。RDF一個(gè)重要的設(shè)計(jì)原則是數(shù)據(jù)的易發(fā)布以及共享,圖數(shù)據(jù)庫則把重點(diǎn)放在了高效的圖查詢和搜索上。其次,RDF以三元組的方式來存儲(chǔ)數(shù)據(jù)而且不包含屬性信息,但圖數(shù)據(jù)庫一般以屬性圖為基本的表示形式,所以實(shí)體和關(guān)系可以包含屬性,這就意味著更容易表達(dá)現(xiàn)實(shí)的業(yè)務(wù)場(chǎng)景。其中Neo4j系統(tǒng)目前仍是使用率最高的圖數(shù)據(jù)庫,它擁有活躍的社區(qū),而且系統(tǒng)本身的查詢效率高,但唯一的不足就是不支持準(zhǔn)分布式。相反,OrientDB和JanusGraph(原Titan)支持分布式,但這些系統(tǒng)相對(duì)較新,社區(qū)不如Neo4j活躍,這也就意味著使用過程當(dāng)中不可避免地會(huì)遇到一些刺手的問題。如果選擇使用RDF的存儲(chǔ)系統(tǒng),Jena或許一個(gè)比較不錯(cuò)的選擇。

四、Neo4J 介紹與安裝
4.1 引言
“工欲善其事,必先利其器”,知識(shí)圖譜作為一種特殊的圖結(jié)構(gòu),自然需要專門的圖數(shù)據(jù)庫進(jìn)行存儲(chǔ)。
知識(shí)圖譜由于其數(shù)據(jù)包含實(shí)體、屬性、關(guān)系等,常見的關(guān)系型數(shù)據(jù)庫諸如MySQL之類不能很好的體現(xiàn)數(shù)據(jù)的這些特點(diǎn),因此知識(shí)圖譜數(shù)據(jù)的存儲(chǔ)一般是采用圖數(shù)據(jù)庫(Graph Databases)。而Neo4j是其中最為常見的圖數(shù)據(jù)庫。
4.2 Neo4J 下載
首先在 Neo4J官網(wǎng) 下載 Neo4J。
- Neo4J分為社區(qū)版和企業(yè)版:
- 企業(yè)版:收費(fèi),在橫向擴(kuò)展、權(quán)限控制、運(yùn)行性能、HA等方面都比社區(qū)版好,適合正式的生產(chǎn)環(huán)境;
- 社區(qū)版:免費(fèi),普通的學(xué)習(xí)和開發(fā)采用免費(fèi)社區(qū)版就好。
4.3 Neo4J 安裝
- 在Mac或者Linux中,安裝好jdk后,直接解壓下載好的Neo4J包,運(yùn)行命令
bin/neo4j start
- windows系統(tǒng)下載好neo4j和jdk 1.8.0后,輸入以下命令啟動(dòng)后neo4j
neo4j.bat console

4.4 Neo4J Web 界面 介紹
Neo4J提供了一個(gè)用戶友好的 Web 界面,可以進(jìn)行各項(xiàng)配置、寫入、查詢等操作,并且提供了可視化功能。類似ElasticSearch一樣,我個(gè)人非常喜歡這種開箱即用的設(shè)計(jì)。
打開瀏覽器,輸入http://127.0.0.1:7474/browser/,如下圖 13 所示,界面最上方就是交互的輸入框。

記錄一下windows安裝的坑:


如果conf文件把這句話注釋掉,就會(huì)出現(xiàn)身份未驗(yàn)證,客戶端未授權(quán)的bug,所以不能注釋掉。
4.5 Cypher查詢語言
Cypher:
介紹:是Neo4J的聲明式圖形查詢語言,允許用戶不必編寫圖形結(jié)構(gòu)的遍歷代碼,就可以對(duì)圖形數(shù)據(jù)進(jìn)行高效的查詢。
設(shè)計(jì)目的:類似SQL,適合于開發(fā)者以及在數(shù)據(jù)庫上做點(diǎn)對(duì)點(diǎn)模式(ad-hoc)查詢的專業(yè)操作人員。
其具備的能力包括:
創(chuàng)建、更新、刪除節(jié)點(diǎn)和關(guān)系
通過模式匹配來查詢和修改節(jié)點(diǎn)和關(guān)系 - 管理索引和約束等
五、Neo4J 實(shí)戰(zhàn)
5.1 引言
這個(gè)案例的節(jié)點(diǎn)主要包括人物和城市兩類,人物和人物之間有朋友、夫妻等關(guān)系,人物和城市之間有出生地的關(guān)系。特別鳴謝知乎@異塵手把手教你快速入門知識(shí)圖譜 - Neo4J教程
- Person-Friends-PERSON
- Person-Married-PERSON
- Person-Born_in-Location
5.2 創(chuàng)建節(jié)點(diǎn)
-
刪除數(shù)據(jù)庫中以往的圖,確保一個(gè)空白的環(huán)境進(jìn)行操作【注:慎用,如果庫內(nèi)有重要信息的話】:
image.png
MATCH (n) DETACH DELETE n
這里,MATCH是匹配操作,而小括號(hào)()代表一個(gè)節(jié)點(diǎn)node(可理解為括號(hào)類似一個(gè)圓形),括號(hào)里面的n為標(biāo)識(shí)符。
創(chuàng)建一個(gè)人物節(jié)點(diǎn):
CREATE (n:Person {name:'John'}) RETURN n
注:
CREATE是創(chuàng)建操作,Person是標(biāo)簽,代表節(jié)點(diǎn)的類型。
花括號(hào){}代表節(jié)點(diǎn)的屬性,屬性類似Python的字典。
這條語句的含義就是創(chuàng)建一個(gè)標(biāo)簽為Person的節(jié)點(diǎn),該節(jié)點(diǎn)具有一個(gè)name屬性,屬性值是John。
創(chuàng)建更多的人物節(jié)點(diǎn),并分別命名:
CREATE (n:Person {name:'Sally'}) RETURN n
CREATE (n:Person {name:'Steve'}) RETURN n
CREATE (n:Person {name:'Mike'}) RETURN n
CREATE (n:Person {name:'Liz'}) RETURN n
CREATE (n:Person {name:'Shawn'}) RETURN n
如圖 15 所示,6個(gè)人物節(jié)點(diǎn)創(chuàng)建成功

創(chuàng)建地區(qū)節(jié)點(diǎn)
CREATE (n:Location {city:'Miami', state:'FL'})
CREATE (n:Location {city:'Boston', state:'MA'})
CREATE (n:Location {city:'Lynn', state:'MA'})
CREATE (n:Location {city:'Portland', state:'ME'})
CREATE (n:Location {city:'San Francisco', state:'CA'})
可以看到,節(jié)點(diǎn)類型為Location,屬性包括city和state。
如圖 16 所示,共有6個(gè)人物節(jié)點(diǎn)、5個(gè)地區(qū)節(jié)點(diǎn),Neo4J貼心地使用不用的顏色來表示不同類型的節(jié)點(diǎn)。

5.3 創(chuàng)建關(guān)系
朋友關(guān)系
MATCH (a:Person {name:'Liz'}),
(b:Person {name:'Mike'})
MERGE (a)-[:FRIENDS]->(b)
注:
方括號(hào)[]即為關(guān)系,F(xiàn)RIENDS為關(guān)系的類型。
注意這里的箭頭-->是有方向的,表示是從a到b的關(guān)系。 這樣,Liz和Mike之間建立了FRIENDS關(guān)系。
關(guān)系增加屬性
MATCH (a:Person {name:'Shawn'}),
(b:Person {name:'Sally'})
MERGE (a)-[:FRIENDS {since:2001}]->(b)
增加更多的朋友關(guān)系:
MATCH (a:Person {name:'Shawn'}), (b:Person {name:'John'}) MERGE (a)-[:FRIENDS {since:2012}]->(b)
MATCH (a:Person {name:'Mike'}), (b:Person {name:'Shawn'}) MERGE (a)-[:FRIENDS {since:2006}]->(b)
MATCH (a:Person {name:'Sally'}), (b:Person {name:'Steve'}) MERGE (a)-[:FRIENDS {since:2006}]->(b)
MATCH (a:Person {name:'Liz'}), (b:Person {name:'John'}) MERGE (a)-[:MARRIED {since:1998}]->(b)
這樣,圖譜就已經(jīng)建立好了:

5.4 創(chuàng)建 出生地關(guān)系
建立不同類型節(jié)點(diǎn)之間的關(guān)系-人物和地點(diǎn)的關(guān)系
MATCH (a:Person {name:'John'}), (b:Location {city:'Boston'}) MERGE (a)-[:BORN_IN {year:1978}]->(b)
MATCH (a:Person {name:'Liz'}), (b:Location {city:'Boston'}) MERGE (a)-[:BORN_IN {year:1981}]->(b)
MATCH (a:Person {name:'Mike'}), (b:Location {city:'San Francisco'}) MERGE (a)-[:BORN_IN {year:1960}]->(b)
MATCH (a:Person {name:'Shawn'}), (b:Location {city:'Miami'}) MERGE (a)-[:BORN_IN {year:1960}]->(b)
MATCH (a:Person {name:'Steve'}), (b:Location {city:'Lynn'}) MERGE (a)-[:BORN_IN {year:1970}]->(b)
這里的關(guān)系是BORN_IN,表示出生地,同樣有一個(gè)屬性,表示出生年份。
如圖 18 ,在人物節(jié)點(diǎn)和地區(qū)節(jié)點(diǎn)之間,人物出生地關(guān)系已建立好。
創(chuàng)建節(jié)點(diǎn)的時(shí)候就建好關(guān)系
CREATE (a:Person {name:'Todd'})-[r:FRIENDS]->(b:Person{name:'Carlos'})
最終該圖譜如下圖所示:

5.5 圖數(shù)據(jù)庫查詢
查詢下所有在Boston出生的人物
MATCH (a:Person)-[:BORN_IN]->(b:Location {city:'Boston'}) RETURN a,b
結(jié)果如圖 19:

查詢所有對(duì)外有關(guān)系的節(jié)點(diǎn)
MATCH (a)--() RETURN a
結(jié)果如圖 20:

查詢所有有關(guān)系的節(jié)點(diǎn)
MATCH (a)-[r]->() RETURN a.name, type(r)
結(jié)果如圖21:

查詢所有對(duì)外有關(guān)系的節(jié)點(diǎn),以及關(guān)系類型
MATCH (a)-[r]->() RETURN a.name, type(r)
結(jié)果如圖22:

查詢所有有結(jié)婚關(guān)系的節(jié)點(diǎn)
MATCH (n)-[:MARRIED]-() RETURN n
結(jié)果如圖 23:

查找某人的朋友的朋友
MATCH (a:Person {name:'Mike'})-[r1:FRIENDS]-()-[r2:FRIENDS]-(friend_of_a_friend) RETURN friend_of_a_friend.name AS fofName
返回Mike的朋友的朋友,結(jié)果如圖 24:

5.6 刪除和修改
增加/修改節(jié)點(diǎn)的屬性
MATCH (a:Person {name:'Liz'}) SET a.age=34
MATCH (a:Person {name:'Shawn'}) SET a.age=32
MATCH (a:Person {name:'John'}) SET a.age=44
MATCH (a:Person {name:'Mike'}) SET a.age=25
這里,SET表示修改操作
刪除節(jié)點(diǎn)的屬性
MATCH (a:Person {name:'Mike'}) SET a.test='test'
MATCH (a:Person {name:'Mike'}) REMOVE a.test
刪除屬性操作主要通過REMOVE 3. 刪除節(jié)點(diǎn)
MATCH (a:Location {city:'Portland'}) DELETE a
刪除節(jié)點(diǎn)操作是DELETE 4. 刪除有關(guān)系的節(jié)點(diǎn)
MATCH (a:Person {name:'Todd'})-[rel]-(b:Person) DELETE a,b,rel
六、通過 Python 操作 Neo4j
6.1 neo4j模塊:執(zhí)行CQL ( cypher ) 語句
# step 1:導(dǎo)入 Neo4j 驅(qū)動(dòng)包
from neo4j import GraphDatabase
# step 2:連接 Neo4j 圖數(shù)據(jù)庫
driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "password"))
# 添加 關(guān)系 函數(shù)
def add_friend(tx, name, friend_name):
tx.run("MERGE (a:Person {name: $name}) "
"MERGE (a)-[:KNOWS]->(friend:Person {name: $friend_name})",
name=name, friend_name=friend_name)
# 定義 關(guān)系函數(shù)
def print_friends(tx, name):
for record in tx.run("MATCH (a:Person)-[:KNOWS]->(friend) WHERE a.name = $name "
"RETURN friend.name ORDER BY friend.name", name=name):
print(record["friend.name"])
# step 3:運(yùn)行
with driver.session() as session:
session.write_transaction(add_friend, "Arthur", "Guinevere")
session.write_transaction(add_friend, "Arthur", "Lancelot")
session.write_transaction(add_friend, "Arthur", "Merlin")
session.read_transaction(print_friends, "Arthur")
上述程序的核心部分,抽象一下就是:
neo4j.GraphDatabase.driver(xxxx).session().write_transaction(函數(shù)(含tx.run(CQL語句)))
或者
neo4j.GraphDatabase.driver(xxxx).session().begin_transaction.run(CQL語句)
6.2 py2neo模塊:通過操作python變量,達(dá)到操作neo4j的目的
# step 1:導(dǎo)包
from py2neo import Graph, Node, Relationship
# step 2:構(gòu)建圖
g = Graph()
# step 3:創(chuàng)建節(jié)點(diǎn)
tx = g.begin()
a = Node("Person", name="Alice")
tx.create(a)
b = Node("Person", name="Bob")
# step 4:創(chuàng)建邊
ab = Relationship(a, "KNOWS", b)
# step 5:運(yùn)行
tx.create(ab)
tx.commit()
py2neo模塊符合python的習(xí)慣,寫著感覺順暢,其實(shí)可以完全不會(huì)CQL也能寫
七、通過csv文件批量導(dǎo)入圖數(shù)據(jù)
前面學(xué)習(xí)的是單個(gè)創(chuàng)建節(jié)點(diǎn),不適合大批量導(dǎo)入。這里我們介紹使用neo4j-admin import命令導(dǎo)入,適合部署在docker環(huán)境下的neo4j。 其他導(dǎo)入方法也可以參考Neo4j之導(dǎo)入數(shù)據(jù)
csv分為兩個(gè)nodes.csv和relations.csv,注意關(guān)系里的起始節(jié)點(diǎn)必須是在nodes.csv里能找到的:
# nodes.csv需要指定唯一ID和nam,
headers = [
'unique_id:ID', # 圖數(shù)據(jù)庫中節(jié)點(diǎn)存儲(chǔ)的唯一標(biāo)識(shí)
'name', # 節(jié)點(diǎn)展示的名稱
'node_type:LABEL', # 節(jié)點(diǎn)的類型,比如Person和Location
'property' # 節(jié)點(diǎn)的其他屬性
]
# relations.csv
headers = [
'unique_id', # 圖數(shù)據(jù)庫中關(guān)系存儲(chǔ)的唯一標(biāo)識(shí)
'begin_node_id:START_ID', # begin_node和end_node的值來自于nodes.csv中節(jié)點(diǎn)
'end_node_id:END_ID',
'begin_node_name',
'end_node_name',
'begin_node_type',
'end_node_type',
'relation_type:TYPE', # 關(guān)系的類型,比如Friends和Married
'property' # 關(guān)系的其他屬性
]
制作出兩個(gè)csv后,通過以下步驟導(dǎo)入neo4j:
兩個(gè)文件nodes.csv ,relas.csv放在
neo4j安裝絕對(duì)路徑/import
導(dǎo)入到圖數(shù)據(jù)庫mygraph.db
neo4j bin/neo4j-admin import --nodes=/var/lib/neo4j/import/nodes.csv --relationships=/var/lib/neo4j/import/relas.csv --delimiter=^ --database=mygraph.db
delimiter=^ 指的是csv的分隔符
指定neo4j使用哪個(gè)數(shù)據(jù)庫
修改 /root/neo4j/conf/neo4j.conf 文件中的 dbms.default_database=mygraph.db
重啟neo4j就可以看到數(shù)據(jù)已經(jīng)導(dǎo)入成功了
導(dǎo)入csv的坑:
正確導(dǎo)入方法,按照教程把一些keys寫入csv里(表格形式)
nodes.csv:

relation.csv:

然后填入一些數(shù)據(jù),注意start_id和end_id一定要和關(guān)聯(lián)的第一張表的主鍵聯(lián)系起來,第一個(gè)是start_id,最后一個(gè)是end_id.
如果要把數(shù)據(jù)庫改成自己的,那么就需要把配置文件conf中的active_database改成自己的數(shù)據(jù)庫,這樣才會(huì)在你的界面中顯示出來:
dbms.active_database=mygraph.db
dbms.default_database=mygraph.db



