甜rdf / rdf-interface
PHP RDF 库的通用 RDF 接口。
Requires
- php: >=8.0
- psr/http-message: ^1.0 || ^2.0
- zozlak/rdf-constants: *
Requires (Dev)
- dev-master
- 2.0.0
- 2.0.0-RC7
- 2.0.0-RC6
- 2.0.0-RC5
- 2.0.0-RC4
- 2.0.0-RC3
- 2.0.0-RC2
- 2.0.0-RC1
- 1.0.1
- 1.0.0
- 1.0.0-RC1
- 0.11.0
- 0.10.1
- 0.10.0
- 0.9.0
- 0.8.1
- 0.8.0
- 0.7.1
- 0.7.0
- 0.6.0
- 0.5.1
- 0.5.0
- 0.4.5
- 0.4.4
- 0.4.3
- 0.4.2
- 0.3.1
- 0.3.0
- 0.2.0
- 0.1.0
- dev-datasetNode
- dev-1.0.0-backports
- dev-fix/readme-rdfInterfaceTests-link
- dev-termCompare
- dev-feature/issue-15-all-values-strings
This package is auto-updated.
Last update: 2024-09-13 14:24:35 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/JS 和 RDFLib 的强烈影响。
强类型
rdfInterface 是强类型的。
强类型提供了许多好处。它确保了语法是明确的且可扩展的,允许利用静态代码分析,并使错误更容易理解。
强类型的缺点是语法更加冗长,但我们认为其带来的好处远远超过了这个缺点。
不可变性
RdfInterface 术语是不可变的。无法更改它们的属性。您只能获取一个新的对象实例,将给定的属性设置为新的值。
不可变性提供了三个好处
- 它使程序员清楚地知道没有变化的回传。
- 它容易实现而没有缺陷(与深度克隆相反)。
- 它允许实现有用的性能优化(例如,全局术语缓存)。
现代PHP应该已经熟悉这种做法,例如PSR-7请求/响应对象遵循相同的方法。
使用流进行数据导入和导出
RdfInterface使用流作为RDF解析输入和序列化输出。
流比字符串更加灵活。它们允许异步操作,具有更低的内存占用,很好地符合PSR-7接口,还有更多。
最后但同样重要的是,可以将字符串轻松打包到内存流中。
重用原生PHP接口
RdfInterface,特别是Dataset
接口扩展了原生PHP接口,例如。
- 可迭代数据集的边/节点。
- ArrayAccess用于添加/删除/访问数据集的边。
- Countable例如,用于计算数据集中的四元组。
使用原生接口使库更容易学习,并且感觉与PHP生态系统更好地集成。
可扩展性
RdfInterface旨在可扩展。
RDF在引入新想法(如RDF-star)的同时也在变化,API应该能够适应这种发展。
因此,Quad
规范相当宽松,允许任何术语作为主题和对象。
这并不意味着所有实现都必须支持任何可能的术语。实现可以支持他们想要的任何子集,仅检查他们是否可以处理从用户接收到的术语就是他们的责任。