Dgraph使用總結



1.背景
  Dgraph是一個分布式的開源圖數據庫, 官方文檔地址https://docs.dgraph.io/, 建議英文水平好的朋友可以直接去訪問了解. 本文僅是對自己使用Dgraph的過程做一個總結, 着重介紹它的查詢語法和一些有用而有重要的查詢.

2.概念
2.1 Schema
  Dgraph和其它的大多數數據庫一樣, 也用schema來描述數據的類型(本質上都是圖的邊), 支持的類型如下

類型 描述
int 64位有符號整數
float 雙精度浮點數
string 字符串
bool 布爾類型
dateTime RFC3339格式時間戳
geo 地理位置類型
password string (encrypted)
uid 圖的邊類型,用於由一個節點指向另一個節點,且帶有方向
Dgraph中有節點和值兩種類型, 每個節點都有一個內部分配的64位整數的uid屬性, 用於唯一標記該節點. 節點與節點之間由 uid類型的邊連接, 節點與值之間由標量類型的邊連接.

2.2 數據寫入
  Dgraph的數據導入遵循W3C標准RDF格式, 這個格式是一種三元組格式, 形式如下:

<subject> <predicate> <object> .

subject 代表圖的一個節點, predicate代表節點的邊名, object代表邊的值(值的類型就是上述schema的類型)

  寫入例子1:

<0x01> <name> "Alice" .

  這個三元組, 在圖的場景下表示相當於: uid=0x01的節點的name邊指向了字符串Alice, 在關系數據庫的場景相當於: 更新id=1的記錄的name字段為Alice

  寫入例子2:

_:alice <name> "Alice" .
_:alice <friend> _:bob .
_:bob <name> "Betty" .

  在不知道uid的場景下, 寫入數據時每個節點由dgraph內部分配一個uid, 且可以用_:identifier的形式代表該節點, 以方便后面繼續使用. 比如上述例子表示, 名叫"Alice"的人(即節點)有個名叫"Betty"的朋友.

  除了三元組的格式外, dgraph還提供了json格式的數據寫入, 比如 寫入例子2 的三元組可用下面json表示:

{
"uid": "_:alice",
"name": "Alice",
"friend": {
"uid": "_:bob",
"name": "Betty"
}
}

3. 查詢
  Dgraph的查詢語法是以GraphQL為基礎, 在此基礎上針對自身的需要會對該語法規則有所改變.

3.1 Function/Filter
  Dgraph使用function和filter對查詢數據進行過濾. 在dgraph中function和filter的區別僅在於放位置的不同.下面是支持的function和filter:

名稱 有效類型 描述
allofterms string 類似與like過濾, 如allofterms(predicate, "space-separated term list")表示過濾某個邊的值必須同是包含space-separated,term和list三個詞, 但忽略順序.
anyofterms string 與allofterms類似, 但anyofterms只要求包含任一個詞.
alloftext string 全文檢索
regexp string 正則匹配, 語法為regexp(name, /^Steven*/)
eq,lt,le,gt,ge int, float, string, dateTime 分別代表=, <, <=, >, >=
uid / 語法為uid(0x11,0x12), 根據傳進來的uid值, 過濾相應節點
has / 語法為has(name), 過濾有某條邊的節點
and,or,not / 邏輯過濾器, 用於聯結上述的function/filter
  查詢例子1:

{
#查詢名字里同時包含Farhan Akhtar的人
q(func: allofterms(name, "Farhan Akhtar")) {
uid
name
}
}

  查詢例子2:

{
#查詢名字里以Steven開頭的導演和他導演的含有ryan字符串的電影
directors(func: regexp(name, /^Steven*$/)) {
name
director.film @filter(regexp(name, /ryan/i)) {
name
}
}
}

3.2 查詢變量
  dgraph可以通過as關鍵詞將一個查詢塊的任意部分設為一個變量, 以供后面的子查詢或者其它查詢塊使用. 這個變量本質上是一個uid列表, 因此要利用uid函數進行引用.

  通用的查詢格式為:

{
A as not_a_real_query(...) {
B as some_edge @filter(...) { # can't use C or B in this filter
C as ... {
# A, B and C here
}

# A, B and C here
}

# A, B and C can be used in any blocks here
}

# A, B and C can be used in any other query block
}

  查詢例子1:

{
#查詢名叫"Peter Jackson"的人的自導自演電影和扮演的角色
PJ as var(func:allofterms(name, "Peter Jackson")) {
F as director.film
}

peterJ(func: uid(PJ)) {
name
actor.film {
performance.film @filter(uid(F)) {
film_name: name
}
performance.character {
character: name
}
}
}
}

3.3 Facets
  Dgraph 用facets描述邊的自定義屬性. 如兩個用戶間有一條叫friend的邊, 可以利用facets在這friend邊上設置一個close屬性值表示他們的親密度.

  帶facets的數據寫入例子:

_:alice <name> "Alice" .
_:alice <mobile> "040123456" (since=2006-01-02T15:04:05) .
_:alice <car> "MA0123" (since=2006-02-02T13:01:09, first=true) .
1
2
3
facets數據寫入在最后的()里設置

  查詢facets數據:

query
{
data(func: eq(name, "Alice")) {
name
mobile @facets(since)
car @facets(since)
}
}

result
{
"data": {
"data": [
{
"name": "Alice",
"mobile|since": "2006-01-02T15:04:05Z",
"mobile": "40123456",
"car|since": "2006-02-02T13:01:09Z",
"car": "MA0123"
}
]
}
}

facets數據默認用predicate_name|facet_name的格式展示

3.4 Recurse Query
  Recurse Query也叫遞歸查詢. 此查詢會一層層的展開一組邊,直到我們到達所有葉節點或達到的最大深度參數depth指定的深度.

  查詢例子:

query
{
#查詢member_id=60002581用戶的2級下線
event(func: allofterms(member_id, "60002581")) @recurse(loop: false, depth:3) {
member_id
~member_next_level_of

}
}

result
{
"data": {
"event": [
{
"member_id": "60002581",
"~member_next_level_of": [
{
"member_id": "70005199",
"uid": "0x459b"
}
],
"uid": "0x2382"
}
]
}
}

3.5 K-Shortest Path Queries
  也即最短路徑查詢, 用於查詢Dgraph中兩個節點的最短路徑. 常見的使用場景為想要分析某用戶與某產品之間的關系路徑.
  查詢例子:

query
{
path as shortest(from: 0x24a, to: 0x4) {
~purchase
purchase
}

path(func: uid(path)) {
uid
}
}
result
{
"data": {
"path": [
{
"uid": "0x24a"
},
{
"uid": "0x85"
},
{
"uid": "0x1ca6"
},
{
"uid": "0x4"
}
],
"_path_": [
{
"purchase": [
{
"~purchase": [
{
"purchase": [
{
"uid": "0x4"
}
],
"uid": "0x1ca6"
}
],
"uid": "0x85"
}
],
"uid": "0x24a"
}
]
}
}

4.部署
  Dgraph支持單機部署和集群部署兩種方式. 在Dgraph中有zero, alpha,ratel三類服務(也叫節點), 其中zero服務充當協調alpha的角色; alpha則是對外提供數據寫入和查詢的服務, 外部的客戶端主要都是和alpha交互; ratel則是一個提供UI界面的服務, 方便用戶寫入/查詢數據,查看/修改schema.

4.1 單機部署
下載和安裝
curl https://get.dgraph.io -sSf | bash //這條指令會自動下載最新版本的dgraph並自動安裝
1
啟動服務
//啟動zero服務, 默認使用5080端口與外部通訊
dgraph zero
//啟動alpha服務, 默認使用9080端口與外部通訊
dgraph alpha --lru_mb 2048 --zero localhost:5080
//啟動ratel, 默認使用8000端口對外提供訪問
dgraph-ratel
1
2
3
4
5
6
4.2 集群部署
  假設集群機器數為3台

下載和安裝
此步驟與單機部署的下載安裝相同, 在3台機器上均執行上述指令.

啟動服務

//選擇某一台機器上啟動zero服務, 用my參數指定自身的host, 以便和集群的alpha服務通訊, 用replicas指定副本數
dgraph zero --my dev210.sugo.net:5080 --replicas 3
//在三台機器上啟動alpha服務, 用my參數指定自身的host
dgraph alpha --lru_mb 2048 --my dev210.sugo.net:7080 --zero dev210.sugo.net:5080 //210機器執行
dgraph alpha --lru_mb 2048 --my dev211.sugo.net:7080 --zero dev210.sugo.net:5080 //211機器執行
dgraph alpha --lru_mb 2048 --my dev212.sugo.net:7080 --zero dev210.sugo.net:5080 //212機器執行
//選擇某一台機器啟動ratel服務
dgraph-ratel

注意:
集群模式下, 若zero設置了replicas參數, 則集群必須有半數以上的alpha節點存活才可對外提供服務. 在本例下, 即需要2個及以上數量的alpha節點存活才能提供服務.
————————————————
版權聲明:本文為CSDN博主「Joson_cyz」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_24236769/article/details/84848913


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM