7个版本

0.0.7 2021年12月9日
0.0.6 2021年11月29日

#1939数据库接口

1KB

Grabl GitHub release Discord Discussion Forum Stack Overflow Stack Overflow

认识TypeQL(以及TypeDB

TypeDB是一个具有丰富和逻辑类型系统的强类型数据库。TypeDB让您能够应对复杂问题,而TypeQL是它的查询语言。

更高的表达能力

TypeQL允许您根据逻辑和面向对象原则来建模您的领域。由实体类型、关系类型和属性类型以及类型层次、角色和规则组成,TypeQL允许您以比连接表、列、文档、顶点、边和属性更高的层次来思考。

实体-关系模型

TypeQL允许您使用广为人知的实体-关系模型来建模您的领域。它由实体类型、关系类型和属性类型组成,并引入了角色类型。TypeQL允许您利用ER模型的全部表达能力,并通过第一范式描述您的架构。

define

person sub entity,
  owns name,
  plays employment:employee;
company sub entity,
  owns name,
  plays employment:employer;
employment sub relation,
  relates employee,
  relates employer;
name sub attribute,
  value string;

类型层次

TypeQL允许您轻松地将类型继承建模到您的领域模型中。遵循逻辑和面向对象原则,TypeQL允许数据类型继承其超类型的behaviours和properties。复杂的数据结构变得可重用,数据解释通过多态性变得更加丰富。

define

person sub entity,
  owns first-name,
  owns last-name;

student sub person;
undergrad sub student;
postgrad sub student;

teacher sub person;
supervisor sub teacher;
professor sub teacher;

N-ary关系

在现实世界中,关系不仅仅是两个事物之间的二元连接。在丰富的系统中,我们通常需要同时捕获三个或更多相互关联的事物。将它们表示为单独的二元关系将丢失信息。TypeQL可以自然地将任意数量的事物表示为一个关系。

match
 
$person isa person, has name "Leonardo";
$character isa character, has name "Jack";
$movie isa movie;
(actor: $person, character: $character, movie: $movie) isa cast;
get $movie;
 
answers>>
 
$movie isa movie, has name "Titanic";

嵌套关系

关系是我们用来描述两个或更多事物之间关联的概念。有时,这些事物本身也可以是关系。TypeQL可以自然地表示这些结构,因为它允许关系嵌套在另一个关系中,从而使您能够以最自然的形式表达系统的模型。

match
 
$alice isa person, has name "Alice";
$bob isa person, has name "Bob";
$mar ($alice, $bob) isa marriage;
$city isa city;
($mar, $city) isa located;
 
answers>>
 
$city isa city, has name "London";

更高的安全性

类型提供了一种描述数据逻辑结构的方法,使TypeDB能够验证您的代码是否正确地插入和查询数据。查询验证不仅限于静态类型检查,还包括无意义查询的逻辑验证。严格的类型检查错误使您拥有可以信赖的数据集。

逻辑数据验证

插入的数据会经过比属性值类型静态检查更严格的验证。实体将只验证包含正确的属性,关系将只验证逻辑上允许的事物之间的关联。TypeDB通过评估涉及事物的多态类型,对插入的实体和关系执行更丰富的验证。

insert

$charlie isa person, has name "Charlie";
$dataCo isa company, has name "DataCo";
(husband: $charlie, wife: $dataCo) isa marriage; # invalid relation

commit>>

ERROR: invalid data detected during type validation

逻辑查询验证

在TypeDB上执行的读取查询将经过类型解析过程。这个过程不仅优化了查询的执行,还充当静态类型检查器,拒绝无意义和不可满足的查询,因为它们很可能是用户错误。

match

$alice isa person, has name "Alice";
$bob isa person, has name "Bob";
($alice, $bob) isa marriage;
$dataCo isa company, has name "DataCo";
($bob, $dataCo) isa marriage; # invalid relation

answers>>

ERROR: unsatisfiable query detected during type resolution

随着逻辑推理的发展

TypeDB通过推理引擎对您的数据进行逻辑编码。它启用类型推理和规则推理,从而创建数据的逻辑抽象。这允许发现难以找到的事实和模式;并且复杂查询变得简单得多。

规则

TypeQL允许您在模式中定义规则。这扩展了您模型的表达能力,因为它使系统能够在数据集中满足某种逻辑形式时得出新的结论。像编程中的函数一样,规则可以相互链接,在数据级别创建行为抽象。

define

rule transitive-location:
when {
  (located: $x, locating: $y);
  (located: $y, locating: $z);
} then {
  (located: $x, locating: $z);
};

推理

TypeDB的推理功能将一个查询转换为其所有可能的解释。这是通过两种机制实现的:基于类型和基于规则的推理。这不仅得出新的结论并揭示隐藏的关系,还使复杂的模式抽象为简单的查询。

match

$person isa person;
$uk isa country, has name "UK";
($person, $uk) isa location;
get $person;

answers>>

$person isa teacher, has name "Alice";
$person isa postgrad, has name "Bob";

使用TypeQL

TypeQL(原生语法)

所有TypeDB客户端以及TypeDB控制台都原生支持TypeQL语法。如果您正在使用TypeDB,您不需要额外的库/工具即可原生使用TypeQL语法。

TypeQL for Java

语言库

要使用TypeQL语言库进行Java编程,以便能够以编程方式构建查询而不是手动字符串连接,请访问vaticle/typeql-lang-java

语法

如果您想开发Java中的TypeQL插件或扩展,并需要TypeQL语法库,您可以导入以下Maven包。

<repositories>
    <repository>
        <id>repo.vaticle.com</id>
        <url>https://repo.vaticle.com/repository/maven/</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>com.vaticle.typeql</groupId>
        <artifactId>typeql-grammar</artifactId>
        <version>{version}</version>
    </dependency>
</dependencies>

{version}替换为版本号,您可以在我们的Maven仓库中找到最新的TypeQL语法。

TypeQL for Python

语言库

要使用TypeQL语言库进行Python编程,以便能够以编程方式构建查询而不是手动字符串连接,请访问typedb-osi/typeql-lang-python。该项目目前正在社区中开发。欢迎您为项目开发做出贡献。

语法

如果您想开发Python中的TypeQL插件或扩展,并需要TypeQL语法库,您可以导入以下PyPI包。

pip install typeql-grammar=={version}

{version}替换为版本号,您可以在TypeQL的PyPi页面上找到最新的版本。

贡献

TypeDB & TypeQL 在其发展过程中使用了各种开源的图和分布式计算框架。如今,TypeDB & TypeQL 是基于以下框架构建的:RocksDBANTLRSCIPBazelGRPC,和 ZeroMQ,以及 Caffeine。在过去,TypeDB 由各种开源技术和社区支持,我们对此深表感激:Apache CassandraApache HadoopApache SparkApache TinkerPop,和 JanusGraph。谢谢!


许可协议

TypeQL 语言及相关材料按照由自由软件基金会发布的 GNU Affero 通用公共许可证 v3.0 ("AGPL 3.0") 进行分发,但有以下特殊例外。

AGPL 3.0 的例外:任何基于 Vaticle TypeQL 仓库中的材料或材料构建的 TypeQL 语言库,并且用于与使用或通过 Vaticle Limited(英国公司编号 08766237)或其任何继任实体(但排除该软件的任何分支版本)创建、管理或访问的数据库进行通信或交互(每种情况),可以按照以下许可证之一进行分发

如上所述,“继任实体”是指当时拥有 TypeDB 软件版权的任何实体,这些版权之前属于 Vaticle Ltd。

如果您对 TypeQL 代码或相关材料进行了任何更改或贡献,那么此例外将适用于使用或实现该更改/贡献的任何 TypeQL 语言库。

依赖项

~1.5MB
~37K SLoC