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

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

若是你是第一次接觸Neo4j,而且以前也都沒接觸過相似的Graph Database的話,建議先瀏覽一下我以前的一篇博客:爲何選擇圖形數據庫,爲何選擇Neo4j?。畢竟應該在作一件事以前要想清楚爲何要作是吧。java


1. 安裝

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


2. 入門

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

2.1 圖形操做界面

運行Neo4j後,在瀏覽器中打開網頁:http://localhost:7474, 便可進入Neo4j的圖形操做界面,在裏面能夠直接操做數據庫,也能夠查看數據庫的狀態。數據庫

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

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

2.2 Cypher基本語句

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

  • 插入節點。插入一個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;

接着就是查詢語句了,做爲圖形數據庫,確定要來點不同凡響的查詢對吧。ide

  • 最短路徑。
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;

還有更多的操做能夠參考官方用戶手冊:官方用戶手冊post

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/

相關文章
相關標籤/搜索