1 个稳定版本
2.24.0 | 2023 年 9 月 20 日 |
---|
在 #polymorphism 中排名 25
310KB
7K SLoC
了解 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使用RocksDB、ANTLR、SCIP、Bazel、GRPC、ZeroMQ和Caffeine构建。在过去,TypeDB由各种开源技术和社区支持,我们对这些支持和贡献表示深深的感激:Apache Cassandra、Apache Hadoop、Apache Spark、Apache TinkerPop和JanusGraph。谢谢!
许可
如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