1. 程式人生 > >dgraph中schema的閱讀筆記

dgraph中schema的閱讀筆記

hint from style 工作 string previous 反向 刪除 ESS

參考:https://tour.dgraph.io/schema/1/

這個教程主要關於一個schema怎麽樣在dgraph裏面運作,並且告訴我們怎麽樣去增加、更新、刪除一個數據(也就是怎麽變動(mutate)數據)的

一、增加、修改schema

dgraph裏的schema描述了predicate的類型,當我們想要向已有的schema裏添加數據時,我們新增就好了。但是如果我們想要向一個新的(還沒創建的)schema裏新增數據,我們有兩個選擇:

1.直接新增數據,dgraph會自動新增這個schema

2.先定義一個schema,再新增數據。

這兩種方法都可以的。不過如果要用functions或是filter,predicate必須是被索引的,所以在這種情況下,我們需要先定義schema.

不知道下面兩句想表達啥。。沒頭沒尾的,直接貼出來好了

Alter schema to define data types and to add indexes.

Run to alter schema. The index allows applying filter functions, such as searching for all companies that participate in a particular industry.

示例:

industry: string @index(term) .
boss_of: uid .

二、新增、修改數據

現在schema已經被更新了,我們可以三個一組來新增數據了。

dgraph為每個數據節點創建它自己的內部的id,但是我們有時我們需要多次使用一個節點,就像下面例子中的_:company1一樣:

{
set {
_:company1 <name> "CompanyABC" .
_:company2 <name> "The other company" .

_:company1 <industry> "Machinery" .

_:company2 <industry> "High Tech" .

_:jack <works_for> _:company1 .


_:ivy <works_for> _:company1 .
_:zoe <works_for> _:company1 .

_:jose <works_for> _:company2 .
_:alexei <works_for> _:company2 .

_:ivy <boss_of> _:jack .

_:alexei <boss_of> _:jose .
}
}

//運行結果如下:

{
  "data": {
    "code": "Success",
    "message": "Done",
    "uids": {
      "alexei": "0x21",
      "company1": "0x22",
      "company2": "0x23",
      "ivy": "0x25",
      "jack": "0x24",
      "jose": "0x20",
      "zoe": "0x1f"
    }
  },
  "extensions": {
    "server_latency": {
      "parsing_ns": 330152,
      "processing_ns": 8271549
    },
    "txn": {
      "start_ts": 86,
      "commit_ts": 87,
      "lin_read": {
        "ids": {
          "1": 65
        }
      }
    }
  }
}

技術上來說,這些是空節點,他們告訴dgraph去創建一個節點,給它一個內部id並且確認它能夠被一致地使用。

運行了上面的代碼之後,_:company1在dgraph中並不存在,我們也不能去搜索它。我們會發現_:company1已經變成了一個內部id(如上面的運行結果中的uids塊),我們可以搜索這個內部id,使用方法func:uid(<uid_number>)。


讓dgraph中的數據產生變化被稱作為mutating數據。

三、外部標識

dgraph並不支持外部對節點設置id,如果一個應用的節點需要唯一的標識而不是由dgraph來定義,那這些節點需要聲明為一個邊(edges),由用戶的應用來確保這些id的唯一性。

四、語言支持

語言標簽應用於輸入時的字符串上,如下:

_:myID <an_edge> "something"@en .

_:myID <an_edge> "某物"@zh-Hans .

也應用於搜索時的邊上,如下:(原文鏈接https://tour.dgraph.io/basic/4/)

{
language_support(func: allofterms(name@hi, "????")) {
name@bn:hi:en
age
friend {
name@ko:ru
age
}
}
}


五、反向邊

邊都是有方向的,一個搜索不可以反向對邊進行遍歷。

有兩個方法可以從兩個方向對邊進行查詢:

1.自己把所有邊的反向邊都加上,然後把數據也加上。

2.使用@reverse 關鍵詞,如下 :

boss_of: uid @reverse .

運行上面的變更,那麽dgraph會計算所有的反向邊。an_edge 的反向邊表示為 ~an_edge.

至於數據模型,一些反向邊依然有意義,比如boss_of邊,或者friend邊,有時並不總是雙向的。

六、實踐:聚合現有數據

我們已經新增了一個schema並且載入了一些公司數據,但是怎麽樣去聚合我們以前的朋友集到現在的公司呢?

不能使用空的節點,因為這些空的節點並不存在,所以我們需要用到uid.

以下為錯誤示例,因為_:sarah和_:company1都並不存在

_:sarah <works_for> _:company1 .

以下為正確示例:

<uid-for-sarah> <works_for> <uid-for-company1> .

下面這一段用原文吧

Because the uid picked by Dgraph is unique, we can’t help you this time. Use the uid’s picked by your instance of Dgraph to write a mutation that links the company and friendship data. Hint: previous queries will tell you the uid.

The process you’ve just done here would normally done programmatically - query the data to get the uid’s, formulate the mutations, then batch the updates.

七、刪除數據

有三種刪除的方式:

  • <uid> <edge> <uid>/"value" . 刪除一個單獨的triple
  • <uid> <edge> * . 刪除一個邊的所有的triple
  • <uid> * * . 刪除一個節點的所有的triples

下面的例子並不完全,uids應該是唯一的。

{
delete {
# Delete a single triple
<0x1c3eb> <name> "Steven" .
<0x1c3eb> <age> "38" .

# Delete all triples for a given edge
<0x1c3eb> <friend> * .

# Delete all triples for a given node
<0x1c3eb> * * .
}
}

八、謂語查詢 (predicate query)

_predicate_查詢的是一個節點的所有外連的邊。

註意:設計一個圖與schema和intent不同。因為任何一個節點可能也可能不會有其他節點有的所有的謂語。

Something to try: query for the outgoing edges of some people from the friends data and note how some have owns_pet listed and some do not.      

一般來說,大型圖表通常表示的部分視圖建模數據。我們的工作分析是理解數據的關系數據在處理空白或不完整的知識。

示例如下:

{
company(func: allofterms(name, "CompanyABC")) {
_predicate_
}
}

九、擴展predicate

expand(...predicates...) 被用來查詢所有的謂語,而不是在查詢語句中列出來(嗯???)。調用expand(_all_)

用來從每個符合條件的節點裏查詢所有的邊 。expand可以層層嵌套。我們之後會說如何使用expand去查詢一個特定的邊集。

expand示例:

{
expand(func: allofterms(name, "Michael")) {
expand(_all_) {
expand(_all_) {
expand(_all_)
}
}
}
}

dgraph中schema的閱讀筆記