跳转至

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)/(24*60*60))
      }
    
      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
        }
      }
    }