Neo4j簡介
Neo4j是一個高性能的,NOSQL圖形數據庫,它將結構化數據存儲在網絡上而不是表中。Neo4j也可以被看作是一個高性能的圖引擎,該引擎具有成熟數據庫的所有特性。程序員工作在一個面向對象的、靈活的網絡結構下而不是嚴格、靜態的表中——但是他們可以享受到具備完全的事務特性、企業級的數據庫的所有好處。
Neo4j因其嵌入式、高性能、輕量級等優勢,越來越受到關注。
圖形數據結構
在一個圖中包含兩種基本的數據類型:Nodes(節點) 和 Relationships(關系)。Nodes 和 Relationships 包含key/value形式的屬性。Nodes通過Relationships所定義的關系相連起來,形成關系型網絡結構。

Neo4j安裝
Neo4j可以被安裝成一個獨立運行的服務端程序,客戶端程序通過REST API進行訪問。也可以嵌入式安裝,即安裝為編程語言的第三方類庫,目前只支持java和python語言。
因Neo4j是用java語言開發的,所以確保將要安裝的機器上已安裝了jre或者jdk
安裝為服務
此種安裝方式簡單,各平台安裝過程基本一樣
- 從http://neo4j.org/download上下載最新的版本,根據安裝的平台選擇適當的版本。
- 解壓安裝包,解壓后運行終端,進入解壓后文件夾中的bin文件夾。
- 在終端中運行命令完成安裝
Linux/MacOS系統
neo4j install
Windows系統Neo4j.bat install - 在終端中運行命令開啟服務
Linux/MacOS系統
service neo4j-service start
Windows系統Neo4j.bat start
通過stop命令可以關閉服務,status命令查看運行狀態
支持python嵌入式安裝
第一步:安裝Jpype
從http://sourceforge.net/projects/jpype/files/JPype/ 下載最新版本,windows有exe格式的直接安裝程序,linux平台要下載源碼包,解壓后運行sudo python setup.py install完成安裝
第二步:安裝 neo4j-embedded
如果安裝了python的包管理工具 pip 或者 easy_install 可直接運行
Pip install neo4j-embedded
easy_install neo4j-embedded
也可以從http://pypi.python.org/pypi/neo4j-embedded/下載相應的安裝包完成安裝。
Neo4j使用實例
有如下所示的用戶關注關系所形成的關系網絡

現在利用圖形數據庫進行數據的儲存,並獲得user1 的粉絲,並為user4 推薦好友
示例代碼:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Neo4j圖形數據庫示例
#
from neo4j import GraphDatabase, INCOMING
# 創建或連接數據庫
db = GraphDatabase('neodb')
# 在一個事務內完成寫或讀操作
with db.transaction:
#創建用戶組節點
users = db.node()
# 連接到參考節點,方便查找
db.reference_node.USERS(users)
# 為用戶組建立索引,便於快速查找
user_idx = db.node.indexes.create('users')
#創建用戶節點
def create_user(name):
with db.transaction:
user = db.node(name=name)
user.INSTANCE_OF(users)
# 建立基於用戶name的索引
user_idx['name'][name] = user
return user
#根據用戶名獲得用戶節點
def get_user(name):
return user_idx['name'][name].single
#建立節點
for name in ['user1', 'user2','user3','user4']:
create_user(name)
#為節點間添加關注關系(FOLLOWS)
with db.transaction:
get_user('user2').FOLLOWS(get_user('user1'))
get_user('user3').FOLLOWS(get_user('user1'))
get_user('user4').FOLLOWS(get_user('user3'))
# 獲得用戶1的粉絲
for relationship in get_user('user1').FOLLOWS.incoming:
u = relationship.start
print u['name']
#輸出結果:user2,user3
#為用戶4推薦好友,即該用戶關注的用戶所關注的用戶
nid = get_user('user4').id
#設置查詢語句
query = "START n=node({id}) MATCH n-[:FOLLOWS]->m-[:FOLLOWS]->fof RETURN n,m,fof"
for row in db.query(query,id=nid):
node = row['fof']
print node['name']
#輸出結果:user1
