Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

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 不支持三元组项,把携带三元组项的数据集序列化到二者之一会抛出异常(见范围与当前限制)。

相关内容