Dgraph使用小记

Dgraph

概念 #

Console #

  • Mutate: 突变, 结构/数据变化的时候用
  • Query: 查询, Emmmm查询的时候用
  • 所以看来没有getset了????

Schema #

管理字段(Predicate, Type, list,lang,index等)

问题 #

新手村的时候使用dgraph/standalone 但此时(2021-12-8 18:30:23)文档使用的版本为dgraph/standalone:v21.03.2但是这个版本的Ratel UI不工作…. 导致hello 不了 world很是难受

结果换了dgraph/standalone:v20.11.3好了诶.

sudo docker run --rm -it -p "8080:8080" -p "9080:9080" -p "8000:8000" -v ~/dgraph:/dgraph "dgraph/standalone:v20.11.3"
http://127.0.0.1:8000

突变 #

set #

内容较多, 下面单独罗列

delete #

根据UID 删除指定predicate_name

{
    delete {
        <UID> <predicate_name> * .
    }
}

set #

创建 #

直接json给出结构和数据,即可完成创建.只不过如果有用到@lang时就需要去Schema里更新一下字段 - 类型 ???? (Schema-Type)的支持项

{
  "set": [
    {
      "food_name": "Sushi",
      "review": [
        {
          "comment": "Tastes very good",
          "comment@jp": "とても美味しい",
          "comment@ru": "очень вкусно"
        }
      ],
      "origin": [
        {
          "country": "Japan"
        }
      ]
    }
  ]
}

更新 #

使用和创建差不多,不过目前我已知的更新只能用UID否则都会直接创建一个相同内容的新数据出来

{
  "set":[
    {
      "uid": "{UID}",
      "age": 41
    }
  ]
}

查询 #

has #

直接json 返回值也会按照这个格式给出,层级深浅可随意自定

{
  good_name(func: has(food_name)) {
    food_name
    review
  }
}
{
  good_name(func: has(food_name)) {
    food_name
    review{
      comment
    }
  }
}

uid #

除了上述的has还有很多查询内置方法,不过深度的话除了手动罗列也可通过recurse - depth来确定,写多了也不会多返回

{
  find_follower(func: uid({UID})) @recurse(depth: 4) {
    name
    age
    follows
  }
}

eq&索引 #

需要设置hash索引, 如下为查询Sushireview *为统配 可指定lang, 什么都不加默认无指定lang的数据

{
  food_review(func: eq(food_name,"Sushi")) {
    food_name
    review {
      comment@*
    }
  }
}

<>= #

func说明
eq等于
lt小于
le小于等于
gt大于
ge大于等于
{
  authors_and_ratings(func: ge(rating, 4.0)) {
    uid
    author_name
    rating
    published {
      title
      content
      dislikes
    }
  }
}

索引 #

  • hash 可等查询(eq), 但不支持字符串比较大小
  • exact 唯一允许字符串比较(ge,gt,le,lt)查询的索引(很牛逼的样子)
  • term 带有任意一个(anyofterms), 同时拥有(allofterms), 相等(eq)
// 多个关键字(术语)使用空格隔开即可.
// 查询大小写不敏感
// dgraph 优化机制是将全文转换为token 查询使用查询token 所以多个查询关键词会进行重排列 获取唯一token后去全文中对比. 由此查询词的顺序无关紧要
// 也就是说anyofterms&allofterms的 `1 2 3 == 3 2 1 == 2 1 3` (结果相同是理所当然的, 消耗和内部逻辑也是相同)
{
  find_tweets(func: anyofterms(tweet, "Go GraphQL")) {
    tweet
  }
}