Neo4j安裝&入門&一些優缺點


本篇將介紹Neo4j的安裝,入門,和自己使用了一段時間后發現的優點缺點,爭取簡潔和實用。

如果你是第一次接觸Neo4j,並且之前也都沒接觸過類似的Graph Database的話,建議先瀏覽一下我之前的一篇博客:為什么選擇圖形數據庫,為什么選擇Neo4j?。畢竟應該在做一件事之前要想清楚為什么要做是吧。


1. 安裝

上Neo4j官網,下載community版,點擊安裝即可。很簡單沒什么可說的。


2. 入門

既然是入門,那就從簡單開始,一步一步熟悉Neo4j。

2.1 圖形操作界面

運行Neo4j后,在瀏覽器中打開網頁:http://localhost:7474, 即可進入Neo4j的圖形操作界面,在里面可以直接操作數據庫,也可以查看數據庫的狀態。

頁面頂端可以直接寫Cypher語句並運行。右側則顯示一些數據庫的狀態以及提供一部分操作,包括:

  • Database Information。數據庫信息。節點類別,邊的類別,屬性(包括節點的屬性和邊的屬性)。
  • Favorites。寫好的基本數據庫語句,包括創建節點,查詢節點個數,邊個數等。創建示例圖。查看數據庫的狀態。
  • Documentation。各種官方文檔。
  • Neo4j Browser Sync。清空本地數據庫。與雲端數據庫同步。
  • Browser Settings。圖形操作界面的設置。

2.2 Cypher基本語句

Cypher是Neo4j的數據庫語言,入門的話起碼得知道增刪改查吧。

  • 插入節點。插入一個Person類別的節點,且這個節點有一個屬性name,屬性值為Andres
CREATE (n:Person { name : 'Andres'});
  • 插入邊。插入一條a到b的有向邊,且邊的類別為Follow
MATCH (a:Person),(b:Person)
WHERE a.name = 'Node A' AND b.name = 'Node B'
CREATE (a)-[r:Follow]->(b);
  • 更新節點。更新一個Person類別的節點,設置新的name。
MATCH (n:Person { name: 'Andres' })
SET n.name = 'Taylor';
  • 刪除節點和與其相連的邊。Neo4j中如果一個節點有邊相連,是不能單單刪除這個節點的。
MATCH (n:Person { name:'Andres' })
DETACH DELETE n;
  • 刪除邊。
MATCH (a:Person)-[r:Follow]->(b:Person)
WHERE a.name = 'Andres' AND b.name = 'Taylor'
DELETE r;

接着就是查詢語句了,作為圖形數據庫,肯定要來點與眾不同的查詢對吧。

  • 最短路徑。
MATCH (ms:Person { name:'Andres' }),(cs:Person { name:'Taylor' }), p = shortestPath((ms)-[r:Follow]-(cs)) RETURN p;
  • 查詢兩個節點之間的關系。
MATCH (a:Person { name:'Andres' })-[r]->(b:Person { name:'Taylor' })
RETURN type(r);
  • 查詢一個節點的所有Follower。
MATCH (:Person { name:'Taylor' })-[r:Follow]->(Person)
RETURN Person.name;

還有更多的操作可以參考官方用戶手冊:官方用戶手冊

2.3 創建一個Neo4j數據庫

運行Neo4j之后,在軟件窗口可以選擇數據庫創建位置,之后Neo4j就自動為我們創建好了數據庫。

此處輸入圖片的描述

  • 創建唯一性約束,同時具有索引效果,類似關系型數據庫中的主鍵。注意,這只能在數據庫中還未插入數據時設置。
CREATE CONSTRAINT ON (a:Person) ASSERT a.name IS UNIQUE;
  • 創建索引。
CREATE INDEX ON :Person(name);
  • 查看所有的節點數和邊數
MATCH (n) RETURN count(n);
MATCH ()-->() RETURN count(*);

還有更多的操作可以參考官方用戶手冊:官方用戶手冊

2.4 Neo4j驅動

Neo4j提供了數種語言的數據庫驅動,比如在java中,你可以這樣插入一個節點:

Driver driver = GraphDatabase.driver( "bolt://localhost", AuthTokens.basic( "neo4j", "neo4j" ) );
Session session = driver.session();

session.run( "CREATE (a:Person {name:'Arthur'})" );

session.close();
driver.close();

查詢節點:

Driver driver = GraphDatabase.driver( "bolt://localhost", AuthTokens.basic( "neo4j", "neo4j" ) );
Session session = driver.session();

StatementResult result = session.run( "MATCH (a:Person) WHERE a.name = 'Arthur' RETURN a.name AS name" );
while ( result.hasNext() )
{
    Record record = result.next();
    System.out.println( record.get("name").asString() );
}

session.close();
driver.close();

3. 優缺點

使用了一段時間Neo4j,總結一下我發現的優缺點。

優點:

  1. 數據的插入,查詢操作很直觀,不用再像之前要考慮各個表之間的關系。
  2. 提供的圖搜索和圖遍歷方法很方便,速度也是比較快的。

缺點:

  1. 最不能讓人忍受的就是極慢的插入速度。可能是因為創建節點和邊的時候需要保存一些額外信息(為了查詢服務)。不知道是不是我代碼的問題,插入10000個節點,10000條邊花了將近10分鍾...
  2. 超大節點。當有一個節點的邊非常多時(常見於大V),有關這個節點的操作的速度將大大下降。這個問題很早就有了,官方也說過會處理,然而現在仍然不能讓人滿意。
  3. 提高數據庫速度的常用方法就是多分配內存,然而看了官方操作手冊,貌似無法直接設置數據庫內存占用量,而是需要計算后為其”預留“內存...

4. 適用場景

鑒於其明顯的優缺點,Neo4j適合存儲”修改較少,查詢較多,沒有超大節點“的圖數據。

另外,針對Neo4j的缺點,有一款使用混合索引的數據庫Arangodb也許是一個不錯的考慮對象。根據其官網的說明,Arangodb不僅具有一般圖形數據庫的優點,而且在各種操作的速度上領先於Neo4j。可見:原理上說明為什么Arangodb更快Arangodb與其他幾款數據庫的性能對比

轉載請注明出處:http://www.cnblogs.com/rubinorth/



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM