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