Neo4j基礎入門

Neo4j基礎

在學習Neo4j之前,我們先了解下什麼是圖數據庫。

圖數據庫

圖形數據庫存儲節點和關係而不是表或文檔。數據的存儲就像您在白板上勾畫想法一樣。您的數據在存儲時不限於預定義的模型,允許以非常靈活的方式思考和使用它。

爲什麼需要圖數據庫?

我們生活在一個互聯的世界中,理解大多數領域需要處理豐富的連接集以瞭解真正發生的事情。通常,我們發現項目之間的聯繫與項目本身一樣重要。那麼關係如此重要,我們用傳統的數據庫不能維護嗎?

如下面這個關係圖:

我們嘗試用mysql來存儲的話,其實是可以的。但是我們需要通過昂貴的join,寫複雜的sql才能夠實現。顯然是不划算的。

什麼是Neo4j?

Neo4j是一個開源的無Shcema的基於java開發的圖形數據庫,它將結構化數據存儲在圖中而不是表中。它是一個嵌入式的、基於磁盤的、具備完全的事務特性的Java持久化引擎。程序數據是一個面向對象的、靈活的網絡結構下,而不是嚴格、靜態的表中,但可以享受到具備完全的事務特性、企業級的數據庫的所有好處。

Neo4j的結構

節點:是圖中的實體

  • 節點可以用標籤標記,代表它們在您的域中的不同角色
  • 節點可以保存任意數量的鍵值對或屬性
  • 節點標籤還可以將元數據添加到某些節點

關係:兩個節點實體之間提供定向的,命名的連接

  • 關係總是有一個方向、一個類型、一個開始節點和結束節點,並且它們也可以有屬性
  • 節點可以具有任意數量或類型的關係,而不會犧牲性能

標籤:圖中的LABEL,我們給了他一個Person的標籤

屬性:圖中的PROPERTY,我們給他聲明瞭屬性name,知道了他叫Dan。

應用場景

  • 社交媒體和社交網絡
  • 推薦引擎和產品推薦系統
  • 身份和訪問管理

使用圖形數據庫進行身份和訪問管理時,可以快速有效的跟蹤用戶、查詢關係和授權。

  • 金融反欺詐多維關係分析場景

通過圖可以清楚的知道洗錢網絡及相關嫌疑,例如對用戶所使用的賬號、發生交易時的IP地址、MAC地址、手機IMEI號等進行關聯分析

Neo4j環節搭建

  1. 下載Neo4j
wget https://neo4j.com/artifact.php?name=neo4j-community-3.5.17-unix.tar.gz
  1. 解壓
  2. 修改配置文件conf/neo4j.conf

主要修改允許遠程訪問的地址(將註釋打開即可)

dbms.connectors.default_listen_address=0.0.0.0
  1. 訪問http://ip:7474

使用賬號登錄,默認賬號密碼:neo4j/neo4j

  1. 然後我們就可以在頁面上的輸入框裏,在美元符號後鍵入CQL命令,然後點擊執行按鈕運行命令。

Neo4j CQL

CQL簡介

CQL代表Cypher查詢語言。像關係型數據庫的SQL一樣,Neo4j使用CQL作爲查詢語言。

常用的CQL命令如下:

CQL命令 作用
CREATE 創建節點,關係和屬性
MATCH 檢索有關節點,關係和屬性數據
RETURN 返回查詢結果
WHERE 提供條件過濾檢索MATCH數據
DELETE 刪除節點和關係
REMOVE 刪除節點和關係的屬性
SET 添加或更新標籤
ORDER BY 對結果排序
SKIP LIMIT 分頁
DISTINCT 排重

接下來我們就來詳細介紹一下這些命令:

1. CREATE

CREATE (
 <node-name>:<label-name>
 [{
  <property1-name>:<property1-Value>
  ........
  <propertyn-name>:<propertyn-Value>
 }]
)

語法說明:

語法元素 描述
<node-name> 它是我們將要創建的節點名稱
<label-name> 它是一個節點標籤名稱
<property1-name>...<propertyn-name> 屬性是鍵值對。定義將分配給創建節點的屬性的名稱(可選參數)

我們用慶餘年這部劇裏面的角色和關係來舉例:

CREATE(person:Person {cid:1,name:"範閒",age:24,gender:0,character:"A",money:1000})

2. MATCH RETURN

MATCH
(
 <node-name>:<label-name>
)
RETURN
 <node-name>.<property1-name>,
 ...
 <node-name>.<propertyn-name>
語法元素 描述
<node-name> 它是我們將要創建的節點名稱
<label-name> 它是一個節點標籤名稱
<property-name> 屬性是鍵值對。定義將分配給創建節點的屬性的名稱

示例:

MATCH(person:Person) RETURN person

MATCH(person:Person) RETURN person.name,person.age

3. 關係創建

關係創建比前面的API會麻煩一些,它分爲了兩種情況:

  • 已有節點創建關係
  • 沒有節點創建關係

3.1 使用現有節點創建關係

MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>)
CREATE 
(<node1-label-name>)-[<relationship-label-name>:<relationship-name>
{<define-properties-list>}]->(<node2-label-name>)
RETURN <relationship-label-name>
語法元素 描述
<node1-name> 用於創建關係的"From Node"的節點名稱
<node1-label-name> 用於創建關係的"From Node"的標籤名稱
<node2-name> 用於創建關係的"To Node"的節點名稱
<node2-label-name> 用於創建關係的"To Node"的標籤名稱
<relationship-name> 關係名稱
<relationship-label-name> 關係標籤名稱
<define-properties-list> 關係的屬性(可選參數)

示例:

match(person:Person {name:"範閒"}),(person2:Person {name:"林婉兒"})
create (person)- [r:Couple{mary_date:"2020/12/12"}]->(person2)

3.2 使用新節點創建關係

CREATE 
(<node1-label-name>:<node1-name>{<define-properties-list>})
-[<relationship-label-name>:<relationship-name>{<define-properties-list>}]
->(<node1-label-name>:<node1-name>{<define-properties-list>})

示例:

create(person1:Person {cid:9,name:"靖王世子",age:23,gender:0,character:"A",money:3000})
-[r:Friend {date:"2020/11/2"}]->
(person2:Person {cid:8,name:"二皇子",age:24,gender:0,character:"B",money:4000})

在節點或關係中的屬性可以使用的數據類型:

CQL數據類型 作用
boolean 它用於表示布爾文字:true, false。
byte 它用來表示8位整數。
short 它用於表示16位整數。
int 它用於表示32位整數。
long 它用於表示64位整數。
float 浮點數用於表示32位浮點數。
double Double用於表示64位浮點數。
char Char用於表示16位字符。
String 字符串用於表示字符串。

我創建了幾個關係,頁面上顯示如圖:

4. CREATE創建多個標籤

CREATE (<node-name>:<label-name1>:<label-name2>.....:<label-namen>)

示例:

create (person:Person:Beauty:Picture{cid:20,name:"美女"})

5. WHERE

//簡單的WHERE子句
WHERE <condition>

//複雜的WHERE子句
WHERE <condition> <boolean-operator> <condition>

有and、or、not。

示例:

match (p:Person) where p.cid=1 or p.name="林婉兒" return p

6. DELETE和REMOVE

  • DELETE:刪除節點或刪除節點關係
  • REMOVE:刪除節點或關係的標籤、刪除節點或關係的屬性

示例:

match (p:Person) where p.cid=1 remove p.age

match p = (:Person {name:"林婉兒"})-[r:Couple]-(:Person) delete r

7. SET

給現有節點或關係增加屬性、更新屬性值

match (person:Person {cid:1}) set person.age=24,person.money=4000

8. ORDER BY

示例:

match (person:Person ) return person.name,person.money order by person.money

9. SKIP和LIMIT翻頁查詢

match (person:Person ) return person.name,person.money order by person.money skip 2 limit 2

10. DISTINCT 去重

match (person:Person ) return distinct(person.character)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章