Dgraph 入门教程五(Shema)

news2024/12/28 4:30:39

要想做好图数据库,必须做图数据库设计,想做好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。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何恢复未保存的 Excel 文件

本周我们将 Office 恢复系列扩展到 Excel 恢复,并提出了最常见的问题:如何恢复 Excel 文件? 与 Office Word 不同,Excel 完全是关于表格和计算的。在处理Excel文件时,您可能会遇到更多问题。与往常一样,我们…

java-抢红包一些简单概念

抢红包,比如微信中抢红包,红包金额分配使用的是二倍均值算法。 二倍均值拆包: 拆包要求:所有人抢到的金额之和等于红包总额,每个人最少抢到 0.01 元,每个人抢到的红包金额不要相差太大二倍均值法:假设红包总金额是X&…

python安装laspy遍历las获取所有点的坐标

python3.12 pip install laspy 读取 LAS 文件中的点坐标,可以使用 laspy 库。这个库允许你轻松地读取和操作 LAS 文件中的数据。下面是一个示例代码,演示了如何使用 laspy 读取 LAS 文件中的坐标: 1、方法一 #version laspy:2.…

(C语言)字符分类函数

目录 字符分类函数 1. iscntrl 2. isspace 3. isdigit 4. isxdigit 5. islower 6. isupper 7. isalpha 8. isalnum 9. ispunct 10. isgraph 11. isprint 字符分类函数 C语言中有一系列的函数是专门做字符分类的 ,也就是一个字符是属于什么类型的字符的。…

文献学习-13-机器人顶刊IJRR近期国人新作(2024.3)

一、IJRR简介 The International Journal of Robotics Research(IJRR)是机器人领域的高水平学术期刊,专注于发布关于机器人技术和相关领域的最新研究成果。IJRR创刊于1982年,是该领域的第一本学术刊物,2022-2023最新影…

2024最新版短剧小程序

仿抖音滑动小短剧影视微信小程序源码,带支付收益等模式、支持无限滑动;高性能滑动、预加载、视频预览,支持剧情介绍,集合壁纸另外仿抖音滑动效果;支持会员模式,支持用户单独购买等等多功能。 丰富的后台设…

Golang基于Redis bitmap实现布隆过滤器(完结版)

Golang基于Redis bitmap实现布隆过滤器(完结版) 为了防止黑客恶意刷接口(请求压根不存在的数据),目前通常有以下几种做法: 限制IP(限流)Redis缓存不存在的key布隆过滤器挡在Redis前 …

本鲸:打造科技招商新引擎、实现政企资源高效对接

在当今这个快速变化的时代,科技创新已成为推动社会进步和经济发展的核心动力。本鲸,作为科技创新创业服务的平台,正以其独特的视角和专业服务,为政府和企业提供一站式科技招商解决方案,助力构建创新驱动的经济发展新模…

Rollup Summer:一览 Rollup 生态全景图

作者:Stanley,Kernel Ventures 编译:JIN,Techub News 短短几天内,ZKFair 的总锁定价值(TVL)已达到 1.2 亿美元,目前稳定在 8000 万美元,使其成为增长最快的 Rollup 之一…

系统提示mfc100u.dll丢失或错误的解决方法分享

mfc100u.dll是Microsoft Foundation Classes (MFC)库中的一个关键动态链接库文件。 mfc100u.dll文件是Microsoft Foundation Classes (MFC)库的一部分,这是一个为软件开发者提供的一系列类和功能,旨在简化Windows应用程序的开发过程。这个特定的文件包含…

计算机组成原理之机器:存储器之高速缓冲存储器

计算机组成原理之机器:存储器之高速缓冲存储器 笔记来源:哈尔滨工业大学计算机组成原理(哈工大刘宏伟) Chapter3:存储器之高速缓冲存储器 3.1 概述 3.1.1 为什么用cache? 角度一:I/O设备向…

智能研发新纪元:探索2024年AI辅助研发的发展与趋势

随着人工智能(AI)技术的高速发展与创新,我们迎来了一个全新的时代,尤其是在研发领域。AI正以前所未有的速度和效率推动着科技的突破。2024年,AI辅助研发成为走在时代前端的核心竞争力。在这篇文章中,我们将…

typescript学习(更新中)

目录 开发环境搭建类型如何声明有哪些类型编译配置文件 开发环境搭建 npm i -g typescripttsc检查是否安装成功 类型如何声明 // 先声明再赋值 let a: number a 1// 直接赋值 let b 1function sum(a: number, b: number): number {return a b } console.log(sum(1, 2))有…

使用Apache Kafka的Golang实践指南

您是否在寻找构建可扩展、高性能应用程序的方法,这些应用程序可以实时处理流数据?如果是的话,结合使用Apache Kafka和Golang是一个很好的选择。Golang的轻量级线程非常适合编写类似Kafka生产者和消费者的并发网络应用程序。它的内置并发原语&…

httprunner用例结构(前后置)

说明:httprunner 结合 pytest 的前后置方式 1. 用例级别前后置 1.1. setup teardown class TestCaseRefTestcase(HttpRunner):# 用例级别前后置def setup(self):logger.warning("------用例级别前置")def teardown(self):logger.warning("------用…

算法练习:双指针

目录 1. 双指针1.1 移动 "0"1.2 复写 "0"1.3 快乐数(快慢指针)1.4 盛水最多的容器(单调性原则)1.5 有效三角形个数1.6 两个数之和1.7 三数之和1.8 四数之和 1. 双指针 1.1 移动 “0” 题目信息: …

线程有几种状态,状态之间的流转是怎样的?

Java中线程的状态分为6种: 1.初始(NEW):新创建了一个线程对象,但还没有调用start()方法。 2.运行(RUNNABLE):Java线程中将就绪(READY)和运行中(RUNNING)两种状态笼统的称为“运行”…

红黑树的学习

红黑树 红黑树出自一种平衡的二叉查找树,是计算机科学中中用到的一种数据结构 1972年出现,当时被称之为平衡二叉B树。后来,1978年被修改为如今的红黑树 他是一种特殊的二叉查找树,红黑树的每一个节点上都有存储表示节点的颜色 …

WordPress建站入门教程:如何创建菜单和设置前端导航菜单?

前面我们跟大家分享了WordPress如何上传安装WordPress主题,但是启用主题后前端没有看到有导航菜单,这是因为我们还没有创建菜单和设置导航菜单。 JianYue主题导航菜单和右上角菜单 今天boke112百科就继续跟大家分享WordPress站点如何创建菜单和设置前端…

使用 Amazon Bedrock 上的 Claude 3 将架构图转换为 CDK/Terraform 代码

概述 在云原生领域,基础设施即代码 (IaC) 对于开发人员和 DevOps 团队来说是一种不可避免的实践。 最近,Amazon Bedrock 上线了 Claude 3 Sonnet 模型和这个模型的图像转文本能力。这无疑开启了一个新时代,也就是实现架构图与 IaC 工具的无…