Neo4j 實現一個簡單的CMDB管理平臺
簡介
Neo4j是一個高效能的圖形資料庫管理系統,它使用圖形模型來儲存和查詢資料。圖形資料庫與傳統的關係型資料庫不同,它們使用節點和邊來表示資料實體和它們之間的關係,而不是使用表格和行,可以使用neo4j實現許可權系統,知識圖譜,cmdb等
部署
docker run -d --name=neo4j \
--publish=7474:7474 --publish=7687:7687 \
--volume=$HOME/neo4j/data:/data \
--volume=$HOME/neo4j/logs:/logs \
--volume=$HOME/neo4j/import:/var/lib/neo4j/import \
--volume=$HOME/neo4j/plugins:/plugins \
neo4j:latest
neo4j密碼
docker logs neo4j 2>&1 | grep 'Initial password'
訪問地址:http://ip:7474
建立節點
# ()表示一個node節點,n是一個別名,tag是標籤,{}是該節點的屬性及該屬性對應的值,可以有多個不同屬性,屬性和標籤可以忽略
create (n:tag {"property":"屬性值"})
建立節點與節點關聯關係
# 先匹配要建立關聯關係的兩個節點,其次才建立關聯關係
# 栗子
match (p1:instance {property:"192.168.1.1"}),(p2:env {property:"測試環境"}) create (p1)-[r:envrel {relation:''}]->(p2);
# 先匹配出標籤為`instance`,屬性`property`的值為`192.168.1.1`以及標籤為`env`,屬性`property`的值為`測試環境`的兩個節點,分別為p1和p2,建立p1指向p2的關聯關係
`[r:envre {relation:''}]`:[]代表關聯關係,r是一個別名,envre代表這個關聯關係型別的標籤。{}代表關聯關係的屬性,支援多個不同的屬性
新增邏輯環境節點
Create (n:env {property:"生產環境"});
Create (n:env {property:"測試環境"});
新增主機例項節點
Create (n:instance {system:"Centos Linux",property:"192.168.1.1"});
Create (n:instance {system:"Centos Linux",property:"192.168.1.2"});
Create (n:instance {system:"Centos Linux",property:"192.168.1.3"});
Create (n:instance {system:"Centos Linux",property:"192.168.1.4"});
Create (n:instance {system:"Centos Linux",property:"192.168.1.5"});
Create (n:instance {system:"Centos Linux",property:"192.168.2.1"});
Create (n:instance {system:"Ubuntu Linux",property:"192.168.2.2"});
Create (n:instance {system:"Centos Linux",property:"192.168.2.3"});
Create (n:instance {system:"SUSE Linux",property:"192.168.2.4"});
Create (n:instance {system:"Centos Linux",property:"192.168.2.5"});
建立主機與邏輯環境關聯關係
#192.168.1.x段的ip歸屬於測試環境
#192.168.2.x段的ip歸屬於生產環境
match (p1:instance {property:"192.168.1.1"}),(p2:env {property:"測試環境"}) create (p1)-[r:envrel {relation:''}]->(p2);
match (p1:instance {property:"192.168.1.2"}),(p2:env {property:"測試環境"}) create (p1)-[r:envrel {relation:''}]->(p2);
match (p1:instance {property:"192.168.1.3"}),(p2:env {property:"測試環境"}) create (p1)-[r:envrel {relation:''}]->(p2);
match (p1:instance {property:"192.168.1.4"}),(p2:env {property:"測試環境"}) create (p1)-[r:envrel {relation:''}]->(p2);
match (p1:instance {property:"192.168.1.5"}),(p2:env {property:"測試環境"}) create (p1)-[r:envrel {relation:''}]->(p2);
match (p1:instance {property:"192.168.2.1"}),(p2:env {property:"生產環境"}) create (p1)-[r:envrel {relation:''}]->(p2);
match (p1:instance {property:"192.168.2.2"}),(p2:env {property:"生產環境"}) create (p1)-[r:envrel {relation:''}]->(p2);
match (p1:instance {property:"192.168.2.3"}),(p2:env {property:"生產環境"}) create (p1)-[r:envrel {relation:''}]->(p2);
match (p1:instance {property:"192.168.2.4"}),(p2:env {property:"生產環境"}) create (p1)-[r:envrel {relation:''}]->(p2);
match (p1:instance {property:"192.168.2.5"}),(p2:env {property:"生產環境"}) create (p1)-[r:envrel {relation:''}]->(p2);
新增應用服務節點
Create (n:service {servicetype:"application",property:"許可權系統"});
Create (n:service {servicetype:"email",property:"郵件服務"});
Create (n:service {servicetype:"database",property:"Mysql"});
Create (n:service {servicetype:"application",property:"測試系統"});
Create (n:service {servicetype:"application",property:"oa系統"});
建立服務與主機關聯關係
match (p1:service {property:"oa系統"}),(p2:instance {property:"192.168.2.1"}) create (p1)-[r:servicerel {relation:'隸屬於'}]->(p2);
match (p1:service {property:"許可權系統"}),(p2:instance {property:"192.168.2.2"}) create (p1)-[r:servicerel {relation:'隸屬於'}]->(p2);
match (p1:service {property:"郵件服務"}),(p2:instance {property:"192.168.2.3"}) create (p1)-[r:servicerel {relation:'隸屬於'}]->(p2);
match (p1:service {property:"Mysql"}),(p2:instance {property:"192.168.2.4"}) create (p1)-[r:servicerel {relation:'隸屬於'}]->(p2);
match (p1:service {property:"測試系統"}),(p2:instance {property:"192.168.1.1"}) create (p1)-[r:servicerel {relation:'隸屬於'}]->(p2);
match (p1:service {property:"oa系統"}),(p2:service {property:"Mysql"}) create (p1)-[r:depend {relation:'依賴於'}]->(p2);
匹配所有節點資訊
列出所有節點及關聯資訊,這樣可以很清晰的看出主機與服務及邏輯環境的關聯關係
match (n)
return (n)
匹配某個節點
match(n)
WHERE id(n) = <節點ID>
return n
匹配某個節點及與他關聯的節點
match(n1)-[r]-(n2)
where id(n1)=15
return (n1),r,n2
設定節點屬性
# 為節點id為123的節點設定一個屬性為name,值為John Doe
MATCH (n)
WHERE id(n) = 123
SET n.name = 'John Doe'
刪除節點屬性
# 移除節點id為123的name屬性
MATCH (n)
WHERE id(n) = 123
REMOVE n.name
刪除單個節點
注意:若該節點與其他節點有關聯關係則會刪除失敗
MATCH (n)
WHERE id(n) = <節點ID>
DELETE n
刪除節點及關聯關係
MATCH (n)
WHERE id(n) = <節點ID>
DETACH DELETE n