Diomede

一个基于 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 文件结构被组织成多个命名数据库。所需的数据库是

也可能存在用于索引的可选数据库

术语编码

RDF 术语的编码(在 RDFExtensions.swift 中执行)生成一个 UTF-8 编码的字符串,该字符串要么存储在数据库中(在 `id_to_term` 中),要么使用 SHA256 进行哈希并存储(在 `term_to_id` 中)。编码取决于术语类型,但都使用第一个字符标识类型。

请注意,未执行任何规范化或 Unicode 规范化。

API 和设计选择

所有整数都是 8 字节,并以大端字节序存储。

努力使 LMDB 事务保持短时性。 这意味着匹配操作通常是原子性地执行,从而物化整个术语或四元组 ID 列表。 但是,为了尝试从某种程度的流水线中受益并避免不必要的工作(例如,如果请求了有限数量的匹配项),物化术语值是分批执行的,每个批次都在其自己的读取事务中处理。 这假设术语永远不会从 `term_to_id` 和 `id_to_term` 数据库中删除。

术语 ID 查找数据库(`term_to_id` 和 `id_to_term`)对每个术语同时使用哈希和分配的整数。 虽然这增加了复杂性,但这样做有几个原因