Dgraph 影视数据例子
时间:2020-09-15 10:11:11
参考:
Dgraph 影视数据例子#
Dgraph 官方文档的例子,数据是影视圈的数据。包含电影,导演和演员等。数据集的数据量大约有一百万。 有23000个演员以及8600个电影。
数据结构:
- 基本数据结构
# 人
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
演出的电影 。
数据初始化#
-
下载数据。
百度网盘数据备份: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
-
导入数据,
-f
指定文件位置,需要注意文件路径。
数据查询#
-
首先需要了解的是数据的结构,通过
schema
命令查看数据库数据的结构。 -
可以在一次请求中执行多个查询语句,查询结果对应查询名字字段。
查询变量#
把查询的结果存储到变量中,允许在另外的查询语句中使用其它语句的查询结果,变量表示的是查询块匹配的元素的所有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
}
-
查找参与
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@. } } } } }
-
查找参与过
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@. } } } } }
-
查找
Jane Campion
导演的电影。 -
uid(F_PJ, F_MS)
或A或者B。 -
min(val())
、max(val())
可以应用到int
,float
,string
,bool
, 和date
类型.` -
sum(val())
、avg(val())
求和和平均值。 -
排序
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) } }
-
支持数学运算
+ - * /
。 -
groupby
统计导演的电影类型数量。 -
查询所有导演最近一部电影,按上映时间排序。
{ 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 } } }