甜rdf/rdf-interface

PHP RDF 库的通用 RDF 接口。

2.0.0 2024-02-09 12:03 UTC

README

为什么我们需要通用接口?

PHP RDF 生态系统受到大型单体库的困扰,这些库试图在一个库中提供从解析器到三元组存储、序列化器甚至有时甚至包括 SPARQL 引擎的完整 RDF 栈。

这使得它们难以维护和扩展。这也使得将不同库的各个部分组合在一起成为不可能,例如,将一个库中的快速解析器与另一个库中更好的三元组存储组合起来。

解决这些问题的方法是达成

  • 一组独立的 RDF 栈层:解析器、序列化器、数据集、SPARQL 客户端等。
  • 每一层都应该使用以与其他层进行通信的通用接口(将其视为 RDF 的 PSR-7)。

实现

  • Term 和 Dataset 类的参考实现由 quickRdf 库和 simpleRdf 库提供。
  • Turtle、NTriples、NQuads 和 NTriplesStar 解析器和序列化器由 quickRdfIo 库提供。
  • termTemplates 库中可以找到一个提供方便的 quads/triples 过滤方式的 QuadTemplate 和 LiteralTemplate 类集合。
  • sparqlClient 库提供了一个 SPARQL 客户端(仍处于早期开发阶段)。
  • rdfHelpers 库中可以找到一些通用助手,可以在开发自己的实现或连接外部代码时重用。

兼容性测试

rdfInterfaceTests 提供了一套测试,用于验证您的库是否与 rdfInterface 兼容。

针对 EasyRdf 用户

如果您正在使用 EasyRdf,您可能会发现 rdfInterface API 非常奇怪且难以理解。
本文档 应该会有所帮助。

还有一个 rdfInterface2easyRdf 库,它提供了 rdfInterface 和 EasyRdf 之间的转换例程(双向)。

设计决策

灵感

rdfInterface 受到 RDF/JSRDFLib 的强烈影响。

强类型

rdfInterface 是强类型的。

强类型提供了许多好处。它确保了语法是明确的且可扩展的,允许利用静态代码分析,并使错误更容易理解。

强类型的缺点是语法更加冗长,但我们认为其带来的好处远远超过了这个缺点。

不可变性

RdfInterface 术语是不可变的。无法更改它们的属性。您只能获取一个新的对象实例,将给定的属性设置为新的值。

不可变性提供了三个好处

  1. 它使程序员清楚地知道没有变化的回传。
  2. 它容易实现而没有缺陷(与深度克隆相反)。
  3. 它允许实现有用的性能优化(例如,全局术语缓存)。

现代PHP应该已经熟悉这种做法,例如PSR-7请求/响应对象遵循相同的方法。

使用流进行数据导入和导出

RdfInterface使用流作为RDF解析输入和序列化输出。

流比字符串更加灵活。它们允许异步操作,具有更低的内存占用,很好地符合PSR-7接口,还有更多。

最后但同样重要的是,可以将字符串轻松打包到内存流中。

重用原生PHP接口

RdfInterface,特别是Dataset接口扩展了原生PHP接口,例如。

  • 可迭代数据集的边/节点。
  • ArrayAccess用于添加/删除/访问数据集的边。
  • Countable例如,用于计算数据集中的四元组。

使用原生接口使库更容易学习,并且感觉与PHP生态系统更好地集成。

可扩展性

RdfInterface旨在可扩展。

RDF在引入新想法(如RDF-star)的同时也在变化,API应该能够适应这种发展。

因此,Quad规范相当宽松,允许任何术语作为主题和对象。

这并不意味着所有实现都必须支持任何可能的术语。实现可以支持他们想要的任何子集,仅检查他们是否可以处理从用户接收到的术语就是他们的责任。