一个基于 LMDB 的 RDF 四元组存储。
Diomede 是一个用 Swift 编写的 RDF 四元组存储。它使用 LMDB 作为其底层存储引擎,旨在集成到 Kineo SPARQL 引擎中。LMDB 的使用以及特定的数据布局旨在具有可扩展性,并且可以以渐进的方式使用,从而可以用数据库结构的子集完成简单的任务。
使用从该存储库和 Kineo 构建的工具
% kineo -q sample-database.db -d input-data.nq create
% diomede sample-database.db addindex gpso
% diomede sample-database.db addindex cs
% diomede sample-database.db stats
Diomede-Version: 0.0.13
Last-Modified: 2020-06-18T23:30:23Z
Effective version: 1592523023
Next unassigned term ID: 79769
Next unassigned quad ID: 339768
Graphs: 11963
Quads: 339767 (16MB)
Indexes:
- Quad Orderings:
- gpso (20MB)
- Characteristic Sets (5MB)
- 61215 sets (~5 per graph)
% diomede sample-database.db graphs
urn:uuid:61b2dfbe-bce9-4d73-aa24-0d48c5f35581
urn:uuid:610e0000-0e80-4e10-8455-3ba38710d97c
urn:uuid:6113262b-b790-4c40-8cac-676e0dc5718c
urn:uuid:6132c557-d0eb-456b-96b5-8b49a4d9091a
urn:uuid:612cd8f3-9691-4290-8f87-42a4b22555ab
...
% diomede sample-database.db cs urn:uuid:61b2dfbe-bce9-4d73-aa24-0d48c5f35581
Graph: <urn:uuid:61b2dfbe-bce9-4d73-aa24-0d48c5f35581>
Characteristic Set: count = 4
4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>
4 <http://www.w3.org/2000/01/rdf-schema#label>
Characteristic Set: count = 2
2 <http://www.cidoc-crm.org/cidoc-crm/P190_has_symbolic_content>
2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>
Characteristic Set: count = 1
1 <http://www.cidoc-crm.org/cidoc-crm/P1_is_identified_by>
1 <http://www.cidoc-crm.org/cidoc-crm/P82a_begin_of_the_begin>
1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>
1 <http://www.w3.org/2000/01/rdf-schema#label>
Characteristic Set: count = 1
1 <http://www.cidoc-crm.org/cidoc-crm/P14_carried_out_by>
1 <http://www.cidoc-crm.org/cidoc-crm/P1_is_identified_by>
1 <http://www.cidoc-crm.org/cidoc-crm/P2_has_type>
1 <http://www.cidoc-crm.org/cidoc-crm/P4_has_time-span>
1 <http://www.cidoc-crm.org/cidoc-crm/P67i_is_referred_to_by>
1 <http://www.cidoc-crm.org/cidoc-crm/P7_took_place_at>
1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>
1 <http://www.w3.org/2000/01/rdf-schema#label>
Number of Characteristic Sets: 4
% diomede sample-database.db quads
<http://vocab.getty.edu/aat/300054751> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.cidoc-crm.org/cidoc-crm/E55_Type> <urn:uuid:61b2dfbe-bce9-4d73-aa24-0d48c5f35581> .
<urn:uuid:61b2dfbe-bce9-4d73-aa24-0d48c5f35581> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.cidoc-crm.org/cidoc-crm/E7_Activity> <urn:uuid:61b2dfbe-bce9-4d73-aa24-0d48c5f35581> .
<urn:uuid:5eb9e877-dc18-4783-8aea-d7153c045882> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.cidoc-crm.org/cidoc-crm/E74_Group> <urn:uuid:61b2dfbe-bce9-4d73-aa24-0d48c5f35581> .
_:C368E10B-04CF-4D5B-9751-5384648F219E <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.cidoc-crm.org/cidoc-crm/E33_E41_Linguistic_Appellation> <urn:uuid:61b2dfbe-bce9-4d73-aa24-0d48c5f35581> .
_:7DBAAF97-9750-4325-917F-87B753C393E5 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.cidoc-crm.org/cidoc-crm/E52_Time-Span> <urn:uuid:61b2dfbe-bce9-4d73-aa24-0d48c5f35581> .
<urn:uuid:c0716ced-d43f-4580-b888-c6764057c4fa> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.cidoc-crm.org/cidoc-crm/E33_Linguistic_Object> <urn:uuid:61b2dfbe-bce9-4d73-aa24-0d48c5f35581> .
<urn:uuid:95bfa369-0d77-4ec3-a757-e011cfe2964c> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.cidoc-crm.org/cidoc-crm/E53_Place> <urn:uuid:61b2dfbe-bce9-4d73-aa24-0d48c5f35581> .
_:6CA4A01D-3C96-4974-B002-39D7F4535564 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.cidoc-crm.org/cidoc-crm/E33_E41_Linguistic_Appellation> <urn:uuid:61b2dfbe-bce9-4d73-aa24-0d48c5f35581> .
<http://vocab.getty.edu/aat/300054751> <http://www.w3.org/2000/01/rdf-schema#label> "Auction Event" <urn:uuid:61b2dfbe-bce9-4d73-aa24-0d48c5f35581> .
...
LMDB 文件结构被组织成多个命名数据库。所需的数据库是
quads
这是表示四元组的主表,将四元组 ID(8 字节整数)映射到四个术语 ID(4 个串联的 8 字节整数)。术语 ID 以主语-谓语-宾语-图的顺序存储。
fullIndexes
这是一个包含所有(可选)四元组排序索引的列表的数据库,将索引名称(“spog”的排列组合)映射到一个数组,其中包含索引顺序中每个术语位置的序号。序号表示为 8 字节整数,并且必须是 `[0,1,2,3]` 的排列组合(它本身表示主语-谓语-宾语-图的顺序)。该数据库中的一个条目意味着存在一个数据库,其名称是该条目的键。
term_to_id
这是从 编码术语值的 SHA256 哈希值到术语 ID(8 字节整数)的映射。
id_to_term
这是从术语 ID(8 字节整数)到 编码术语值的映射。
graphs
这是数据库中存在的命名图的表,将术语 ID 映射到空(0 字节)值。它的数据是冗余的,可以从 `quads` 表中每个记录的图位置表示的唯一术语计算得出。
stats
这是一个对 Diomede 系统或最终用户有用的元数据表。存在的一些键是
Diomede-Version
Last-Modified
next_unassigned_term_id
next_unassigned_quad_id
也可能存在用于索引的可选数据库
任何以 “spog” 的排列组合命名的“完整索引”数据库(例如,`spog` 和 `pogs`)
这些数据库按照数据库名称所暗示的顺序(并且显式地作为 `fullIndexes` 数据库中相应条目的值给出),将四个术语 ID(4 个串联的 8 字节整数)映射到四元组 ID(8 字节整数)。
characteristicSets
这是一个包含数据库中每个命名图的 特征集 编码的数据库。数据库中的键是一对(图术语 ID,序列号),编码为 2 个串联的 8 字节整数。这些值是 8 字节整数的数组,其中第一个元素是特征集的总基数,其余元素是(谓词术语 ID,总出现次数,最小出现次数,最大出现次数)元组。
RDF 术语的编码(在 RDFExtensions.swift 中执行)生成一个 UTF-8 编码的字符串,该字符串要么存储在数据库中(在 `id_to_term` 中),要么使用 SHA256 进行哈希并存储(在 `term_to_id` 中)。编码取决于术语类型,但都使用第一个字符标识类型。
IRIs
空白节点
语言标签文字
xsd:integer
文字
xsd:string
文字
其他数据类型文字
请注意,未执行任何规范化或 Unicode 规范化。
所有整数都是 8 字节,并以大端字节序存储。
努力使 LMDB 事务保持短时性。 这意味着匹配操作通常是原子性地执行,从而物化整个术语或四元组 ID 列表。 但是,为了尝试从某种程度的流水线中受益并避免不必要的工作(例如,如果请求了有限数量的匹配项),物化术语值是分批执行的,每个批次都在其自己的读取事务中处理。 这假设术语永远不会从 `term_to_id` 和 `id_to_term` 数据库中删除。
术语 ID 查找数据库(`term_to_id` 和 `id_to_term`)对每个术语同时使用哈希和分配的整数。 虽然这增加了复杂性,但这样做有几个原因
哈希的使用允许 `term_to_id` 数据库中的键具有固定大小,并保持低于 LMDB 键大小限制(这是一个编译时常量,默认为 511 字节)。
使用整数作为术语的主键(而不是哈希值)允许在分配和使用 ID 方面具有一定的灵活性。
此格式的未来发展可能会内联频繁出现的术语或那些具有最小尺寸要求的术语。 这可以减少在查询处理期间物化术语所做的工作。
还可以预期,通过在术语 ID 中内联四元组 ID 值,分配术语 ID 的能力将在未来支持 RDF* 方面发挥作用。