跳转至

Dgraph 影视数据例子

时间:2020-09-15 10:11:11

参考:

  1. https://dgraph.io/tour/moredata/1/
  2. https://dgraph.io/tour/blocksvars/1/

Dgraph 影视数据例子

Dgraph 官方文档的例子,数据是影视圈的数据。包含电影,导演和演员等。数据集的数据量大约有一百万。 有23000个演员以及8600个电影。

数据结构:

  1. 基本数据结构
# 
type Person {
    name           姓名
    director.film  导演的电影 Movie
    actor.film     演员的信息 Performance
}
#电影
type Movie {
    name                    电影的名字
    initial_release_date    电影发布日期
    genre                   电影的类型
    starring                演员的信息 Performance
}
#电影类型
type Genre {
    name   类型
}
# 演员的信息 演员演出的人物演出的电影
type Performance {
    performance.film        演出的电影 Movie
    performance.character   演出的人物电影中的人物
    performance.actor       演出的演员 Person
}
  • director.film 导演的电影,Movie 类型。
  • performance.actor : 演这个角色的演员。有 name 属性。
  • performance.character: 出演角色,如酒吧的女孩,爸爸,女儿等。有 name 属性。
  • performance.character_note: 出演角色备注。
  • actor.film 演出的电影 。

数据初始化

  1. 下载数据。

    curl -L -o 1million.rdf.gz "https://github.com/dgraph-io/tutorial/blob/master/resources/1million.rdf.gz?raw=true" 百度网盘数据备份:

    • 地址:https://pan.baidu.com/s/1TnkQgIFLCnwSVsFwCxSALw
    • 密码:2233
  2. 导入数据,-f 指定文件位置,需要注意文件路径。

    dgraph live -f 1million.rdf.gz --alpha localhost:9080 --zero localhost:5080 -c 1

数据查询

  1. 首先需要了解的是数据的结构,通过 schema 命令查看数据库数据的结构。

    schema{}

  2. 可以在一次请求中执行多个查询语句,查询结果对应查询名字字段。

    { caro(func: allofterms(name@en, "Marc Caro")) { name@en director.film { name@en } } jeunet(func: allofterms(name@en, "Jean-Pierre Jeunet")) { name@en director.film { name@en } } }

查询变量

把查询的结果存储到变量中,允许在另外的查询语句中使用其它语句的查询结果,变量表示的是查询块匹配的元素的所有uid,因此变量只被使用在 uid(变量名字) 查询语句中。

基本语法:变量名字 as 查询语句 { ... } ,变量可以在查询的嵌套查询或者其它查询语句中使用,规则如下:

{
  A as not_a_real_query(...) {
    B as some_edge @filter(...) { # 不能使用变量 B  C
      C as ... { 
        # 可以使用变量 A B C
      }
      # 可以使用变量 A B C
    }
    # 可以使用变量 A B C
  }
  # 可以使用变量 A B C
}
  1. 查找参与 Jane Campion 导演的电影的演员参与演出的电影。

    { # 查找 Jane Campion JC(func:eq(name@en, "Jane Campion")) @cascade { name: name@. # 查找 Jane Campion 导演的电影 director.film { director_film: name@en year: initial_release_date # 查找 Jane Campion 导演的电影的演员表 acotrs: starring { # 查找 Jane Campion 导演的电影的演员表里面演员信息 performance.actor{ actorName:name@. # 查找 Jane Campion 导演的电影的演员表里面演员演出的电影 actor.film{ # 查找 Jane Campion 导演的电影的演员表里面演员演出的电影信息 performance.film{ name@. initial_release_date } } } performance.character{ roleName: name@. } } } } }

  2. 查找参与过 Jane Campion 导演的电影的演员,演出的电影。

    { # 查找 Jane Campion JC(func:eq(name@en, "Jane Campion")) @cascade { name: name@. # 查找 Jane Campion 导演的电影 JCDirectFilms as director.film { director_film: name@en year: initial_release_date # 查找 Jane Campion 导演的电影的演员表 acotrs: starring { # 查找 Jane Campion 导演的电影的演员表里面演员信息 JCDirectorFilmActors as performance.actor{ actorName:name@. # 查找 Jane Campion 导演的电影的演员表里面演员演出的电影,过滤JC导演的电影 actor.film @filter(not uid(JCDirectFilms)){ # 查找 Jane Campion 导演的电影的演员表里面演员演出的电影信息 performance.film{ name@. initial_release_date # 查找 Jane Campion 导演的电影的演员表里面演员演出的电影演员信息 starring { # 查找 Jane Campion 导演的电影的演员表里面演员演出的电影演员信息里面的演员导演,过滤没有参与 JC 导演的电影的演员 performance.actor @filter(uid(JCDirectorFilmActors)) { coactor_name: name@en } } } } } performance.character{ roleName: name@. } } } } }

  3. 查找 Jane Campion 导演的电影。

    ``` { var(func:allofterms(name@en, "Jane Campion")) @cascade { name: name@. JC_films as director.film {} }

    films(func:uid("JC_films")){ name@. initial_release_date } } ```

  4. uid(F_PJ, F_MS) 或A或者B。

  5. min(val())max(val()) 可以应用到 int, float, string, bool, 和 date 类型.`

  6. sum(val())avg(val()) 求和和平均值。

  7. 排序 orderdesc order 和过滤 filter

    ``` { ID as var(func: allofterms(name@en, "Steven")) { director.film { num_actors as count(starring) } average as avg(val(num_actors)) }

    avs(func: uid(ID), orderdesc: val(average)) @filter(ge(val(average), 40)) @normalize { name : name@en average_actors : val(average) num_films : count(director.film) } } ```

  8. 支持数学运算 + - * /

  9. groupby 统计导演的电影类型数量。

    ``` { var(func:allofterms(name@en, "Steven Spielberg")) { director.film @groupby(genre) { a as count(uid) } }

    byGenre(func: uid(a), orderdesc: val(a)) { name@en num_movies : val(a) } } ```

  10. 查询所有导演最近一部电影,按上映时间排序。

    ``` { var(func:has(director.film)){ director.film{ date as initial_release_date } maxDate as max(val(date)) daysSince as math(since(maxDate)/(246060)) }

    var(func:uid(maxDate), orderdesc:val(maxDate), first: 10){ name@en days: val(daysSince) director.film(orderdesc: initial_release_date, first: 1) { name@en initial_release_date } } } ```