參考: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_)
}
}
}
}