快速初步了解Neo4j與使用
Neo4j是一個高性能的,NOSQL圖形數據庫,它將結構化數據存儲在網絡上而不是表中。它是一個嵌入式的、基於磁盤的、具備完全的事務特性的Java持久化引擎,但是它將結構化數據存儲在網絡(從數學角度叫做圖)上而不是表中。Neo4j也可以被看作是一個高性能的圖引擎,該引擎具有成熟數據庫的所有特性。程序員工作在一個面向對象的、靈活的網絡結構下而不是嚴格、靜態的表中——但是他們可以享受到具備完全的事務特性、企業級的數據庫的所有好處。
Neo4j因其嵌入式、高性能、輕量級等優勢,越來越受到關注.

你可以把Neo看作是一個高性能的圖引擎,該引擎具有成熟和健壯的數據庫的所有特性。程序員工作在一個面向對象的、靈活的網絡結構下而不是嚴格、靜態的表中——但是他們可以享受到具備完全的事務特性、企業級的數據庫的所有好處。 [1]
Neo是一個網絡——面向網絡的數據庫——也就是說,它是一個嵌入式的、基於磁盤的、具備完全的事務特性的Java持久化引擎,但是它將結構化數據存儲在網絡上而不是表中。網絡(從數學角度叫做圖)是一個靈活的數據結構,可以應用更加敏捷和快速的開發模式。
1.下載Neo4j桌面版,這里需要先注冊然后下載:
需要先注冊:

2.下載后點擊安裝,這里你可以自己指定安裝的目錄,Next安裝完成后如下:

我們可以依照圖中創建一個project,然后點擊start,這個時候我們進入一個Browser,這個我這里建立的是一個本地的模式,所以可以在本地進行操作,我們進入下一個頁面:

進入這個頁面后,我們可以在最頂上寫代碼語句
3.代碼語句相關語法
我們將首先查看允許我們創建數據的子句。
要添加數據,我們只使用我們已知的模式。通過提供模式,我們可以指定我們想要成為圖形的一部分的圖形結構,標簽和屬性。
顯然,最簡單的條款被稱為CREATE。它將繼續直接創建您指定的模式。
對於我們到目前為止看到的模式,這可能如下所示:
CREATE (:Movie { title:"The Matrix",released:1997 })
如果我們執行此語句,Cypher將返回更改的數量,在這種情況下,添加1個節點,1個標簽和2個屬性。
+-------------------+
| No data returned. |
+-------------------+
Nodes created: 1
Properties set: 2
Labels added: 1
當我們開始使用空數據庫時,我們現在擁有一個包含單個節點的數據庫:

如果我們還想要返回創建的數據,我們可以添加一個RETURN子句,它引用我們分配給模式元素的變量。
CREATE (p:Person { name:"Keanu Reeves", born:1964 })
RETURN p
這是返回的內容:
+----------------------------------------+
| p |
+----------------------------------------+
| Node[1]{name:"Keanu Reeves",born:1964} |
+----------------------------------------+
1 row
Nodes created: 1
Properties set: 2
Labels added: 1
如果我們想要創建多個元素,我們可以用逗號分隔元素或使用多個CREATE語句。
我們當然也可以創建更復雜的結構,例如ACTED_IN與角色信息的關系,或者DIRECTED導演的關系。
CREATE (a:Person { name:"Tom Hanks",
born:1956 })-[r:ACTED_IN { roles: ["Forrest"]}]->(m:Movie { title:"Forrest Gump",released:1994 })
CREATE (d:Person { name:"Robert Zemeckis", born:1951 })-[:DIRECTED]->(m)
RETURN a,d,r,m
這是我們剛剛更新的圖表的一部分:

在大多數情況下,我們希望將新數據連接到現有結構。這要求我們知道如何在圖表數據中找到現有模式,我們將在下面介紹。
2.2.2.2。匹配模式
匹配模式是MATCH語句的任務。我們傳遞了迄今為止用過的相同類型的模式MATCH來描述我們正在尋找的東西。它類似於查詢示例,只是我們的示例還包括結構。
一個MATCH聲明將搜索我們指定,並返回模式每個成功的模式匹配一行。 |
|
|---|---|
為了找到我們到目前為止創建的數據,我們可以開始查找標有Movie標簽的所有節點。
MATCH (m:Movie)
RETURN m
這是結果:

這應該顯示矩陣和阿甘正傳。
我們也可以找一個特定的人,比如基努·里維斯。
MATCH (p:Person { name:"Keanu Reeves" })
RETURN p
此查詢返回匹配節點:

請注意,我們僅提供足夠的信息來查找節點,而不是所有屬性都是必需的。在大多數情況下,您可以使用SSN,ISBN,電子郵件,登錄,地理位置或產品代碼等關鍵屬性進行查找。
我們還可以找到更多有趣的連接,例如Tom Hanks所扮演的電影片名以及他扮演的角色。
MATCH (p:Person { name:"Tom Hanks" })-[r:ACTED_IN]->(m:Movie)
RETURN m.title, r.roles
+------------------------------+
| m.title | r.roles |
+------------------------------+
| "Forrest Gump" | ["Forrest"] |
+------------------------------+
1 row
在這種情況下,我們只返回了我們感興趣的節點和關系的屬性。您可以通過點表示法訪問它們identifer.property。
當然,這只列出了他在Forrest Gump中作為Forrest的角色,因為這是我們添加的所有數據。
現在我們知道足夠的新節點連接到現有的和可能結合起來MATCH,並CREATE以結構連接到圖表。
2.2.2.3。附加結構
要使用新信息擴展圖形,我們首先匹配現有連接點,然后使用關系將新創建的節點附加到它們。添加Cloud Atlas作為Tom Hanks的新電影可以像這樣實現:
MATCH (p:Person { name:"Tom Hanks" })
CREATE (m:Movie { title:"Cloud Atlas",released:2012 })
CREATE (p)-[r:ACTED_IN { roles: ['Zachry']}]->(m)
RETURN p,r,m
這是結構在數據庫中的樣子:

| 重要的是要記住,我們可以將變量分配給節點和關系,並在以后使用它們,無論它們是創建還是匹配。 | |
|---|---|
可以在單個CREATE子句中附加節點和關系。為了便於閱讀,它有助於將它們分開。
組合的一個棘手的方面MATCH,並CREATE為我們得到每個匹配的模式一行。這會導致后續CREATE語句對每行執行一次。在許多情況下,這就是你想要的。如果不是這樣,請在CREATE語句之前移動語句MATCH,或者用后面討論的方法更改查詢的基數,或者使用下一個子句的get或create語義:MERGE。 |
|
|---|---|
2.2.2.4。完成模式
每當我們從外部系統獲取數據或者不確定圖中是否已存在某些信息時,我們希望能夠表達可重復(冪等)的更新操作。在Cypher中MERGE有這個功能。它的作用類似於MATCH or 的組合CREATE,它在創建數據之前首先檢查數據是否存在。隨着MERGE你定義圖案被發現或創建的。通常,與MATCH您一樣,您只想在核心模式中包含要查找的鍵屬性。 MERGE允許您提供要設置的其他屬性ON CREATE。
如果我們不知道我們的圖表是否已經包含Cloud Atlas,我們可以再次合並它。
MERGE (m:Movie { title:"Cloud Atlas" })
ON CREATE SET m.released = 2012
RETURN m
+--------------------------------------------+
| m |
+--------------------------------------------+
| Node[5]{title:"Cloud Atlas",released:2012} |
+--------------------------------------------+
1 row
我們在任何兩種情況下都得到結果:圖表中已有的數據(可能多於一行)或新創建的單個Movie節點。
其中MERGE沒有任何先前分配的變量的子句匹配完整模式或創建完整模式。它永遠不會在模式中產生匹配和創建的部分混合。要實現部分匹配/創建,請確保為不應受影響的部分使用已定義的變量。 |
|
|---|---|
因此,最重要的MERGE是確保您不能創建重復的信息或結構,但它需要首先檢查現有匹配的成本。特別是在大型圖形上,掃描大量標記節點以獲得特定屬性可能是昂貴的。您可以通過創建支持索引或約束來減輕其中的一些,我們將在稍后討論。但它仍然不是免費的,所以每當你一定不會創建重復數據使用CREATE了MERGE。
MERGE也可以斷言關系只創建一次。要使其工作,您必須從先前的模式匹配中傳入兩個節點。 |
|
|---|---|
MATCH (m:Movie { title:"Cloud Atlas" })
MATCH (p:Person { name:"Tom Hanks" })
MERGE (p)-[r:ACTED_IN]->(m)
ON CREATE SET r.roles =['Zachry']
RETURN p,r,m

如果關系的方向是任意的,您可以不用箭頭。 MERGE然后將檢查任一方向的關系,如果未找到匹配關系,則創建新的定向關系。
如果您選擇僅從前一個子句傳入一個節點,則MERGE提供一個有趣的功能。然后,它將僅在給定模式的所提供節點的直接鄰域內匹配,並且如果未找到則創建它。這對於創建例如樹結構非常方便。
CREATE (y:Year { year:2014 })
MERGE (y)<-[:IN_YEAR]-(m10:Month { month:10 })
MERGE (y)<-[:IN_YEAR]-(m11:Month { month:11 })
RETURN y,m10,m11
這是創建的圖形結構:

這里沒有全局搜索兩個Month節點; 它們僅在2014 Year節點的上下文中搜索。
這里我們可以參考如下的文檔查看:
https://neo4j.com/docs/developer-manual/3.4/get-started/cypher/patterns-in-practice/
4.這里我們先建立一個Demo
比如我們平時看電影,張三可以用電影票看電影,李四也可以,他們都去看了同一個電影<葫蘆娃>,相應的語句如下:
CREATE (a:Person { name:"張三",
born:1956 })-[r:電影票 { roles: ["電影票"]}]->(m:Movie { title:"葫蘆娃",released:1994 })
CREATE (d:Person { name:"李四", born:1951 })-[:也看]->(m)
RETURN a,d,r,m
我們建立之后的效果如下:

再比如一2014年的10月11月和12月之間的關系:
CREATE (y:Year { year:2014 })
MERGE (y)<-[:IN_YEAR]-(m10:Month { month:10 })
MERGE (y)<-[:IN_YEAR]-(m11:Month { month:11 })
MERGE (y)<-[:IN_YEAR]-(m12:month{month:12})
RETURN y,m10,m11,m12

我們可以看到neo4j中將幾個有關聯的對象進行了聯系,並從箭頭方向表示相應的關系,此時我們已經通過neo4j建了一個表的數據了.
