1 个稳定版本

2.24.0 2023 年 9 月 20 日

#polymorphism 中排名 25

310KB
7K SLoC

Factory 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 允许数据类型继承其超类型的特性和行为。复杂数据结构变得可重用,通过多态性,数据解释变得更为丰富。

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-元关系

在现实世界中,关系不仅仅是两个事物之间的二元连接。在丰富的系统中,我们经常需要同时捕捉三个或更多相关的事物。将它们表示为单独的二元关系会丢失信息。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语法和语言库

注意:所有TypeDB客户端以及TypeDB控制台都原生接受TypeQL语法。如果您使用TypeDB,您不需要额外的库/工具即可原生使用TypeQL语法。但是,如果您想以编程方式构造TypeQL查询,可以使用以下列出的“语言库”。

贡献

TypeDB和TypeQL在其演变过程中使用了各种开源的图和分布式计算框架。今天,TypeDB和TypeQL使用RocksDBANTLRSCIPBazelGRPCZeroMQCaffeine构建。在过去,TypeDB由各种开源技术和社区支持,我们对这些支持和贡献表示深深的感激:Apache CassandraApache HadoopApache SparkApache TinkerPopJanusGraph。谢谢!


许可

如TypeQL Rust和Java等TypeQL语言库是在2004年1月发布的Apache License,版本2.0下分发的。完整许可证可以在以下位置找到:LICENSE

然而,TypeQL 语法库位于本存储库的 /grammar 包中,根据自由软件基金会发布的 GNU Affero 通用公共许可证 v3.0 ("AGPL 3.0") 进行分发,但有一个特殊例外。有关详细信息,请参阅 TypeQL 语法许可证

版权所有 (C) 2022 Vaticle

依赖项

~5.5–7.5MB
~135K SLoC