一、概述
本篇文章記載了,圖的基本知識,及圖數(shù)據(jù)庫neo4j的 安裝、常用命令、 使用python 操作的一些代碼片段。
二、圖的基本知識
開篇引用:Graphs Are Everywhere,for Everyone? ?
(對于每個人來說,圖無處不在),圖的魅力我無詞言表。
1、節(jié)點 (看這張圖)

2、關系




示例:

3、屬性
節(jié)點 和關系都可以設置自己的屬性(由key-Value 鍵值對組成了)

4、路徑
路徑由至少一個節(jié)點,通過各種關系連接組成,經(jīng)常是作為一個查詢或者遍歷的結(jié)果

二、neo4j的安裝
ubuntu系統(tǒng) 安裝neo4j,參考了 博客的說明:
https://www.cnblogs.com/caoyusang/p/13610408.html
主要步驟如下:
1,從鏡像中找的合適的鏡像
docker?search neo4j
2、選擇官方版本的拉取鏡像源
docker?pull?neo4j(:版本號)?//缺省 “:版本號” 時默認安裝latest版本的
3、查看本地鏡像,檢驗是否拉起成功
docker?images
4、設置neo4j容器運行的相關目錄文件夾
在你根目錄的任意一個子目錄(我這里是/home)下建立四個基本的文件夾
data——數(shù)據(jù)存放的文件夾
logs——運行的日志文件夾
conf——數(shù)據(jù)庫配置文件夾(在配置文件neo4j.conf中配置包括開放遠程連接、設置默認激活的數(shù)據(jù)庫)
5、啟動命令 設置說明
docker run -d --name container_name \ //-d表示容器后臺運行 --name指定容器名字
-p 7474:7474 -p 7687:7687 \ //映射容器的端口號到宿主機的端口號
-v /home/neo4j/data:/data \ //把容器內(nèi)的數(shù)據(jù)目錄掛載到宿主機的對應目錄下
-v /home/neo4j/logs:/logs \ //掛載日志目錄
-v /home/neo4j/conf:/var/lib/neo4j/conf //掛載配置目錄
--env NEO4J_AUTH=neo4j/yourpassword \ //設定數(shù)據(jù)庫的名字的訪問密碼
neo4j //指定使用的鏡像
完整一行命令:
docker?run -d --name container_name -p?7474:7474?-p?7687:7687?-v /home/neo4j/data:/data -v /home/neo4j/logs:/logs -v /home/neo4j/conf:/var/lib/neo4j/conf ?--env NEO4J_AUTH=neo4j/yourpassword neo4j
6、修改配置,支持外網(wǎng)遠程訪問
// 進入容器配置目錄掛載在宿主機的對應目錄,我這里是/home/neo4j/conf
cd /home/neo4j/conf
// vim編輯器打開neo4j.conf
vim neo4j.conf
// 進行以下更改
//在文件配置末尾添加這一行
dbms.connectors.default_listen_address=0.0.0.0 //指定連接器的默認監(jiān)聽ip為0.0.0.0,即允許任何ip連接到數(shù)據(jù)庫
//修改
dbms.connector.bolt.listen_address=0.0.0.0:7687 //取消注釋并把對bolt請求的監(jiān)聽“地址:端口”改為“0.0.0.0:7687”
dbms.connector.http.listen_address=0.0.0.0:7474 //取消注釋并把對http請求的監(jiān)聽“地址:端口”改為“0.0.0.0:7474”
docker?restart 容器id(或者容器名)
?啟動完后:http://192.xxx.xx.xx:7474/browser/? 進行登錄查看
三、neo4j 原生操控
1、增
增加一個節(jié)點:create (n:Person {name:‘我’,age:31})
帶有關系屬性:create (p:Person{name:“我”,age:“31”})-[:包工程{金額:10000}]->(n:Person{name:“好大哥”,age:“35”})
2、刪
刪除無關系節(jié)點:match (n:Person{name:“TYD”}) delete n
刪除關系:match (p:Person{name:“我”,age:“31”})-[f:包工程]->(n:Person{name:“好大哥”,age:“35”}) delete f
刪除關系與節(jié)點:match (p:Person{name:“我”,age:“31”})-[f:包工程]->(n:Person{name:“好大哥”,age:“35”}) delete p,f,n
3、改
加上標簽:match (t:Person) where id(t)=789 set t:好人return t
加上屬性:match (a:好人) where id(a)=789 set a.戰(zhàn)斗力=200 return a
修改屬性:match (a:好人) where id(a)=789 set a.戰(zhàn)斗力=500 return a
4、查
查找節(jié)點:match (p:Person) - [:包工程] -> (n:Person) return p,n
統(tǒng)計條數(shù):MATCH p=()-[r:invent]->() RETURN count(p)
5、清空數(shù)據(jù)庫
MATCH (n)
DETACH DELETE n
? 更多原生的操作可以 百度?cypher語言 進一步了解。
四、python 操控代碼
? ?需pip 安裝插件?
? ? pip install py2neo==2020.1.1
? ?以下提供簡單的操控的python示例代碼:
from py2neo import Graph, Node, Relationship, NodeMatcher, RelationshipMatcher
class Neo4jDB():
????def __init__(self,host="http://192.XX.xx.xxx",user="neo4j",pwd='yourpassword'):
????????try:
????????????self.graph=Graph(host,username=user,password=pwd)
????????????self.matcher=NodeMatcher(self.graph)
????????????self.cursor = None
????????except Exception as e:
????????????print(host,user,pwd)
????????????raise Exception(f"啟動neo4j數(shù)據(jù)出錯:{e}")
????def initCusor(self):
????????self.cursor = self.graph.begin()
????def commitCusor(self):
????????self.cursor.commit()
????def __del__(self):
????????if self.matcher is not None:
????????????self.matcher=None
????????if self.graph is not None:
????????????self.graph=None
????# 新增一個節(jié)點,支持馬上提交生效,及結(jié)合事務方式(initCusor,commitCusor 與這兩個方法配合),批量提交
????def createNode(self,appDo):
????????try:
????????????p=Node("NodeName",appId=appDo.id,name=appDo.name,address=appDo.address,country=appDo.country, aType=atype)
????????????if self.cursor is not None:
????????????????self.cursor.create(p)
????????????else:
????????????????self.graph.create(p)
????????????return p
????????except Exception as e:
????????????raise Exception(f"創(chuàng)建XX節(jié)點出錯:{e}")
????# 查找一個節(jié)點
????def getApplicatnNodeById(self,appId):
????????try:
????????????return self.matcher.match("NodeName", appId=appId).first()
????????except Exception as e:
????????????raise Exception(f"查找XX節(jié)點出錯:{e}")
????# 新增一個關系,支持馬上提交生效,及結(jié)合事務方式(initCusor,commitCusor 與這兩個方法配合),批量提交
????def addApplyRSType(self,sNode,eNode):
????try:
????????r=Relationship(sNode,"RelationName",eNode)
????????if self.cursor is not None:
????????????self.cursor.create(r)
????????else:
????????????self.graph.create(r)
????????return r
????except Exception as e:
????????raise Exception(f"創(chuàng)建XXX關系出錯:{e}")
????# 查找一個關系
????def existRS(self,sNode,eNode):
????????try:
????????????matcherF = RelationshipMatcher(self.graph)
????????????return matcherF.match({sNode,eNode}, 'RelationName').first() is not None
????????except Exception as e:
????????????raise Exception(f"查找XXX關系出錯:{e}")
????# 查找節(jié)點的數(shù)量
????def getNodeCount(self):
????????return self.matcher.match("NodeName").count()
????# 查找關系的數(shù)量
????def getInvenCount(self):
????????matcherF = RelationshipMatcher(self.graph)
????????return matcherF.match(nodes=None, r_type="RelationName").count()