Dgraph 入门教程五(Shema)

要想做好图数据库,必须做图数据库设计,想做好Dgraph,就需要设计好Shema。Shema的语法是必须理解,如果不理解,别人写的Shema,我们也看不懂。我这里也是走马观花式的记录,细节还需要在使用的时候去慢慢理解。看完这篇文章,别人写的Shema,是能看懂的。

1、数据类型

1.1、标量类型

Schema 的标量数据类型有以下几种,Int,Float,String,Boolean,DateTime。还有一种数组类型或者list类型,比如["e1", "e1", "e2"]。

下面是各种类型的定义例子,其中Float 是个list。

type User {
    userID: ID!
    name: String!
    lastSignIn: DateTime
    recentScores: [Float]
    reputation: Int
    active: Boolean
}

1.2、ID类型

可以用ID 类型标记每个节点的唯一字段类型。ID类型可以自动编码,不变的,不重复的。

例如

type Post {
    id: ID!
    ...
}

1.3、枚举类型

你可以定义枚举类型,示例如下

enum Tag {
    GraphQL
    Database
    Question
    ...
}

type Post {
    ...
    tags: [Tag!]!
}

1.4、接口

GraphQL允许你定义接口,节点需要继承父类型的属性,继承的属性和类型都需要一致,示例如下:

interface Fruit {
    id: ID!
    price: Int!
}

type Apple implements Fruit {
    id: ID!
    price: Int!
    color: String!
}

type Banana implements Fruit {
    id: ID!
    price: Int!
}

可以多继承,多继承时,除了ID属性,父类的属性名字不可以一样。

interface Shape {
    id: ID!
    shape: String!
}

interface Color {
    id: ID!
    color: String!
}

type Figure implements Shape & Color {
    id: ID!
    shape: String!
    color: String!
    size: Int!
}

1.5、联合类型

多个类型可以组合成一个类型

enum Category {
  Fish
  Amphibian
  Reptile
  Bird
  Mammal
  InVertebrate
}

interface Animal {
  id: ID!
  category: Category @search
}

type Dog implements Animal {
  breed: String @search
}

type Parrot implements Animal {
  repeatsWords: [String]
}

type Cheetah implements Animal {
  speed: Float
}

type Human {
  name: String!
  pets: [Animal!]!
}

union HomeMember = Dog | Parrot | Human

type Zoo {
  id: ID!
  animals: [Animal]
  city: String
}

type Home {
  id: ID!
  address: String
  members: [HomeMember]
}

1.6、密码类型

密码类型 使用关键字@secret。密码类型不可以直接被查询。密码类型用Bsrypt去加密

例如:

type Author @secret(field: "pwd") {
  name: String! @id
}

1.7、地理类型

类型主要有Point,Polygon和MultiPolygon。

Point

type Point {
	longitude: Float!
	latitude: Float!
}

PointList

type PointList {
	points: [Point!]!
}

Polygon

type Polygon {
	coordinates: [PointList!]!
}

MultiPolygon

type MultiPolygon {
	polygons: [Polygon!]!
}

2、节点关系

节点与节点之间有关系相连。Dgraph 可以描述这些关系。用@hasInverse 可以实现双向相连关系。

2.1 、单向关系

type Author {
    ...
}

type Post {
    ...
    author: Author
}

2.2 、双向关系

type Author {
    ...
    posts: [Post] @hasInverse(field: author)
}

type Post {
    ...
    author: Author
}

3、指令

Dgraph 有很多指令 Directives。知道这些指令的含义,才能看懂和更好的写Shema。

3.1 、 @auth

auth 允许您定义如何对类型的查询/变异应用授权规则。

3.2 、@deprecated

这个指定提醒用户某个属性已经废弃

type MyType {
  id: ID!
  oldField: String @deprecated(reason: "oldField is deprecated. Use newField instead.")
  newField: String
  deprecatedField: String @deprecated
}

3.3、@dgraph

这个指定用于自定义名字,类似别名

type Person @dgraph(type: "Human-Person") {
    name: String @search(by: [hash]) @dgraph(pred: "name")
    age: Int
}

type Human-Person {
    name
    Person.age
}

3.4、@id

该指令可以指定某个属性是id字段

type User {
    username: String! @id
    ...
}

3.5、@search

该指令用于搜索。

搜索是最多的,也是最复杂的。我这里只是简单介绍了下常用的。对于Int,Float和DateTime ,有下面参数。

It:小于。le:小于等于。eq:等于。in:在内。between:在什么中间。ge:大于等于。gt:大于。

下面是个定义和查询

type Post {
    ...
    numLikes: Int @search
}

query {
    queryPost(filter: { numLikes: { gt: 50 }}) { 
        ... 
    }
}

对于String

比如:

type Post {
    title: String @search(by: [term])
    text: String @search(by: [fulltext])
    ...
}

query {
    queryPost(filter: { title: { `allofterms: "GraphQL tutorial"` } } ) { ... }
}

地理字段

举个例子

type Hotel {
  id: ID!
  name: String!
  location: Point @search
  area: Polygon @search
}

queryHotel(filter: {
    location: { 
        near: {
            coordinate: {
                latitude: 37.771935, 
                longitude: -122.469829
            }, 
            distance: 1000
        }
    }
}) {
  name
}

3.6、@generate

用于指定哪些Api生效

type Person @generate(
    query: {
        get: false,
        query: true,
        aggregate: false
    },
    mutation: {
        add: true,
        delete: false
    },
    subscription: false
) {
    id: ID!
    name: String!
}

3.7 @withSubscription

用于订阅属性,一般用于WebSoct。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/440361.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AES加密学习

AES(高级加密标准)是一种对称密钥加密算法,用于加密和解密数据。它被广泛应用于各种安全领域,包括但不限于网络通信、数据存储和软件保护。 历史背景 AES是由比利时密码学家Joan Daemen和Vincent Rijmen设计的Rijndael算法演变而…

家用洗地机哪个型号好用?介绍几个值得考虑的品牌

作为家里的主要清洁工,我一直以来都是负责家里的清洁工作。我经常使用吸尘器和扫地机器人来轮流清洁,虽然效果还不错,但是这种方式太费时间和精力了。特别是在脸上厨房里做完饭和孩子吃完饭后留下的残渣时,我总是需要用传统的拖多…

超级简单的Docker安装(centos7)

文章目录 先安装所需要的工具包设置远程仓库安装启动docker查看版本 先安装所需要的工具包 yum install -y yum-utils #安装工具包,缺少这些依赖将无法完成;设置远程仓库 yum-config-manager --add-repo https://download.docker.com/linux/centos/doc…

【漏洞复现】锐捷 EWEB auth 远程命令执行漏洞

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

洗地机热门品牌测评:石头/希亦/顺造/云鲸洗地机哪个好?哪个牌子最值得入手

大家好,博主是一个热爱生活和科技的居家测评博主。在过去的三年多时间里,我专注于清洁家电——洗地机。我深入测评了三十多款洗地机,现在我将用简单易懂的语言来分享洗地机的选购技巧和热门洗地机机型推荐。 洗地机选购技巧: 看…

掌握java中继承

目录 1.概念: 2.使用: 3.super关键字 4.子类构造方法 5.super和this关键字 6.初始化时代码块的执行顺序 7.继承的方式 8.final关键字 1.概念: 是面向对象程序设计代码可以重复使用的重要手段,允许程序员在保持原有类特性的…

#stm32外设总结电容触摸按键

BS8116A-3 IRQ 外部中断请求 NMOS输出内部上拉 SCL SDA IIC通信接口 VDD 供电电压2.2-5.5V Ct电容: 0~25 pF 电容越大灵敏度越低 1、 软件使用流程 初始化 将IIC的两个引脚初始化为复用开漏模式 按键引脚设置上拉输入 下降沿触发外部中断 void KEY_Init(void) {//uint8_t …

【Unity】分拣机的数字双胞胎集成到Unity3D开发平台中

Unity HMI 一、前言 该项目的重点是通过OPC UA进行客户端-服务器通信的简单演示,该演示在Unity3D中实现(服务器- B&R Automation PLC,客户端- Unity3D)。该项目展示了数字孪生的分拣机与一些额外的功能。该应用程序使用多线程…

E4991A 射频阻抗/材料分析仪

新利通 E4991A 射频阻抗/材料分析仪 —— 1 MHz到 3 GHz —— 简述 E4991A 射频阻抗/材料分析提供极限阻抗测量性能和功能强大的内置分析功能。它将为元器件和电路设计人员测量 3 GHz 以内的元器件提供创新功能,帮助他们进行研发工作。与反射测量技术不同&#x…

想开发苹果群控软件?先了解这些代码!

随着智能设备的普及,群控软件的需求日益增加,特别是针对苹果设备的群控软件,因其出色的性能和广泛的用户基础,受到了开发者们的青睐。 然而,开发一款功能强大的苹果群控软件并非易事,需要深入了解苹果的开…

Research Agent:具有解决基于大型文本语料库的复杂问题,具备深度多跳推理的能力

原文地址:https://towardsdatascience.com/the-research-agent-4ef8e6f1b741 2023 年 8 月 29 日 问题简介 在2021年,开始应对基于大量文本回答问题的挑战。在预训练transformers之前的时代,这个问题很难破解。 人工智能和大型预训练tran…

k8s常用命令大全

k8s常用的命令 下面是一些常用的Kubernetes(K8s)命令,以及它们的简要说明。这些命令可以帮助您管理和操作Kubernetes集群中的资源。 集群管理命令: kubectl cluster-info: 显示集群的基本信息。 kubectl config use-context &l…

Qt 5.14.2 网络编程揭秘:构建高效HTTP客户端与文件下载器

引言 在当今的软件开发世界中,网络通信已成为不可或缺的一部分。Qt,作为一个跨平台的C框架,为我们提供了强大的网络编程能力。本文将带你深入Qt的网络模块,探索如何使用QNetworkAccessManager、QNetworkRequest和QNetworkReply等核…

Qt插件之输入法插件的构建和使用(二)

文章目录 主键盘搭建Google开源引擎音节分割工具类参考项目下载搭建好各个基础控件之后,就可以开发输入法的主界面和引擎了,这也是输入法的核心。 主键盘搭建 输入法的主界面本质上是一个QStackedWidget容器,将各个类型的输入键盘插入到容器中,然后根据业务需要切换不同的…

寡姐出击!《黑寡妇2》AI电影宣传片重磅来袭

寡姐出击!《黑寡妇2》AI电影宣传片重磅来袭 The Black Widow returns, but darkness follows her. Black Widow 2 - Secrets buried deep will rise. A web of lies and deceit threatens her very existence. In the shadows, a new enemy lurks, waiting to strik…

跨网络传输的大致过程+图解(软件虚拟层),ip地址介绍,ip地址和mac地址对比

目录 跨网络传输 引入​​​​​​​ 举例 -- 唐僧西天取经 结论 介绍 ip地址 引入 介绍 类型 公有ip 私有ip 版本 ipv4 ipv6 ip地址和mac地址的唯一性问题 数据包转发的过程 引入 思考 -- 如何跨子网 过程 图解 封装和解包 去掉差异 ip地址/协议的重要…

智慧城市如何助力疫情防控:科技赋能城市安全

目录 一、引言 二、智慧城市与疫情防控的紧密结合 三、智慧城市在疫情防控中的具体应用 1、智能监测与预警系统 2、智慧医疗与健康管理 3、智能交通与物流管理 4、智慧社区与基层防控 四、科技赋能城市安全的未来展望 五、结论 一、引言 近年来,全球范围内…

华为od机试C卷-开源项目热度榜单

1、题目描述 某个开源社区希望将最近热度比较高的开源项目出一个榜单,推荐给社区里面的开发者。 对于每个开源项目,开发者可以进行关注(watch)、收藏(star)、fork、提issue、提交合并请求(MR)等。 数据库里面统计了每个开源项目关注、收藏、fork、issue…

利用“定时执行专家”循环执行BAT、VBS、Python脚本——含参数指定功能

目录 一、软件概述 二、VBS脚本执行设置 三、触发器设置 四、功能亮点 五、总结 在自动化办公和日常计算机任务管理中,定时执行脚本是一项非常重要的功能。今天,我将为大家带来一款名为“定时执行专家”的软件的评测,特别是其定时执行VB…

YOLOX论文解读

paper:YOLOX: Exceeding YOLO Series in 2021 official implementation:https://github.com/Megvii-BaseDetection/YOLOX 本文的创新点 本文在YOLOv3的基础上进行了一些改进:包括将检测头进行解耦的decoupled head、从anchor-based转为anc…