圖基礎知識及neo4j 圖數(shù)據(jù)庫的使用

一、概述

本篇文章記載了,圖的基本知識,及圖數(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()

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容