JavaScript 中的 RDF/JS
在 JavaScript 中,PurRDF 不自创 API 形态:npm 包 @blackcatinformatics/purrdf 在编译为 wasm 的原生引擎之上实现了 RDF/JS 社区规范——DataFactory、DatasetCore 与 Stream/Sink。针对 RDF/JS 接口编写的代码可以直接处理 PurRDF 的项与数据集。
数据工厂
DataFactory 涵盖标准的 RDF/JS 项构造函数——namedNode、blankNode、literal(value, languageOrDatatype?)、variable、defaultGraph、quad、fromTerm、fromQuad——外加显式的 RDF 1.2 扩展:
import { ready, DataFactory } from "@blackcatinformatics/purrdf";
await ready();
const f = new DataFactory();
// RDF/JS 标准接口。
const q = f.quad(
f.namedNode("https://ex/alice"),
f.namedNode("https://ex/knows"),
f.namedNode("https://ex/bob"),
);
// RDF 1.2 扩展:引用三元组项与基础方向字面量。
const quoted = f.quotedTriple(q.subject, q.predicate, q.object);
const rtl = f.directionalLiteral("مرحبا", "ar", "rtl");
typedLiteral 是在规范的重载 literal 之外提供的便捷方法。
数据集
Dataset 实现了 RDF/JS DatasetCore:add、delete、has、match、size 与迭代(for (const quad of dataset)),外加经由原生编解码器的解析与序列化:
import { Dataset } from "@blackcatinformatics/purrdf";
const ds = Dataset.parse("<https://ex/s> <https://ex/p> <https://ex/o> .", "ntriples");
for (const quad of ds.match(null, f.namedNode("https://ex/p"), null)) {
console.log(quad.subject.value);
}
const trig = ds.serialize("trig");
可接受的格式名:turtle、ntriples、nquads、trig、rdfxml、trix、hextuples、jsonld、yamlld,或其媒体类型。由于这些就是原生编解码器,输出是逐字节确定的,并与 Rust、Python 和 C 接口所输出的完全相同(编解码器与确定性)。
SPARQL
运行不止一条查询,或调用方需要带类型的结果而非原始字符串时,使用 QueryEngine。该引擎持有原生 SPARQL 计划缓存,并返回包根级别的项与数据集:
import { QueryEngine } from "@blackcatinformatics/purrdf";
const engine = new QueryEngine();
const result = engine.select(
ds,
"PREFIX ex: <https://ex/> SELECT ?o WHERE { ex:s ex:p ?o }",
);
console.log(result.rows.take(0)?.o?.value);
const graph = engine.construct(
ds,
"PREFIX ex: <https://ex/> CONSTRUCT { ex:copy ex:p ?o } WHERE { ex:s ex:p ?o }",
);
SELECT 行在跨越 wasm 边界时是单一所有者且惰性的。可以迭代 result.rows,调用 result.rows.take(index) 按索引消费,或调用 result.rows.toArray() 物化剩余的行。一行只能被消费一次;在耗尽之前放弃某个结果时,应调用 result.free()。
QueryEngine.queryRaw(...) 把 SELECT/ASK 结果序列化为 SPARQL Results JSON/XML/CSV/TSV,并把图结果序列化为 Dataset.serialize 所接受的同一组图格式。QueryEngine.update(...) 以原子方式应用 SPARQL UPDATE:只有在整个更新成功之后,数据集才会改变。
流与接收器
本包在 purrdf-events 摄取扩展点之上使用异步的 RDF/JS Stream/Sink 协议:
Sink——流式消费者:每个四元组调用一次push(quad),finish()返回累积的Dataset。datasetToStream(dataset)/streamToDataset(stream)——在Dataset与 RDF/JS 流之间架桥,用于与其他 RDF/JS 工具之间的管道输入或输出。
范围说明
- 本包的
Dataset将数据保存在内存中;这里的 SPARQL 方法查询这一驻留数据集。同步方法不安装任何SERVICE或LOAD来源,因此在那里,远程SERVICE或LOAD会显式失败,除非写了SILENT;异步孪生方法只能经由宿主传入的处理函数到达远程端点(见异步查询与联邦查询)。 - 作为四元组宾语的引用三元组项可以在 Turtle、N-Triples、N-Quads、TriG、RDF/XML 以及 JSON-LD / YAML-LD 中往返;TriX 与 HexTuples 不支持三元组项,把携带三元组项的数据集序列化到二者之一会抛出异常(见范围与当前限制)。
相关内容
- 入门:JavaScript / WebAssembly
- RDF 1.2 特性——这些扩展的含义。
crates/rdf-wasm——本包背后的 Rust cdylib。