Neo4j 實現一個簡單的CMDB管理平臺

Jruing發表於2024-11-04

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)

image-20240808171246708

匹配某個節點

match(n)
WHERE id(n) = <節點ID>
return n

匹配某個節點及與他關聯的節點

match(n1)-[r]-(n2)
where id(n1)=15
return (n1),r,n2

image-20240808172909552

設定節點屬性

# 為節點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

相關文章