capdataopera / php-sdk
开发工具,用于公开和检索RDF格式的CapData Opera本体。
Requires
- php: >=7.4
- ext-mbstring: *
- ext-pcre: *
- easyrdf/easyrdf: ^1.1
Requires (Dev)
- ml/json-ld: ^1.2
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^9.6.16
README
在CapData Opéra项目框架下开发 - 法国2030年,由法国歌剧联盟发起。该项目由法国2030年的“增强型现场演出体验”项目支持,由法国存款银行操作。更多信息请访问https://www.rof.fr/rof/capdata-opera.aspx。
PHP SDK允许
- [x] 以RDF格式暴露按照CapData Opéra本体模型化的结构化数据。
- [ ] 通过SPARQL语言查询这些数据,并从查询结果中填充PHP对象。
目录
文档
SDK使用强类型和PHP-doc进行开发,其中包含类型和泛型信息。我们建议您设置您的IDE以利用这些信息。这将为您提供输入辅助和实时文档。
有用链接
- CapData Opéra项目介绍:https://www.rof.fr/ROF/doc/SYRACUSE/89577/
- 参考:https://www.rof.fr/rof/capdata-opera-referentiels.aspx
- 本体:https://ontologie.capdataculture.fr/v1/
- 数据模型可视化:https://ontologie.capdataculture.fr/v1/owl/webvowl/index.html#
- SPARQL EXPLORER:https://sparql.capdataculture.fr/
使用方法
项目中的安装
composer require capdataopera/php-sdk
使用示例
以下是一个使用SDK创建RDF图并将其序列化为Turtle格式的简单示例。
<?php
use CapDataOpera\PhpSdk\Graph\Graph;
use CapDataOpera\PhpSdk\Model\Collectivite;
use CapDataOpera\PhpSdk\Model\Isni;
use CapDataOpera\PhpSdk\Serializer\Serializer;
$serializer = new Serializer();
$graph = new Graph();
$ownOrg = new Collectivite('https://mon-opera.fr/organization/1');
$ownOrg->setNom('Mon opéra de test')
->setFacebook('https://facebook.com/mon-opera')
->setSiteWeb('https://mon-opera.fr')
->setCatalogageSourceAgence($ownOrg)
->setDateCreationRessource(new \DateTimeImmutable('2022-01-30T00:00:00+00:00'))
->setDateModificationRessource(new \DateTimeImmutable('2024-01-30T00:00:00+00:00'))
->setIsni(new Isni('https://isni.org/isni/0000000122982840'));
$graph->add($ownOrg);
/*
* On exporte le graph en RDF avec les ontologies capdata et schema.org pour obtenir un fichier Turtle
*/
echo $serializer->serialize($graph, 'turtle', ['capdata', 'schema']);
支持的类
- [x] 邮政地址:https://ontologie.capdataculture.fr/v1/owl/#Adresse
- [x] 作品类别:https://ontologie.capdataculture.fr/v1/owl/#CategorieOeuvre
- [x] 机构:https://ontologie.capdataculture.fr/v1/owl/#Collectivite
- [x] 职位:https://ontologie.capdataculture.fr/v1/owl/#Fonction
- [x] 作品类型:https://ontologie.capdataculture.fr/v1/owl/#GenreOeuvre
- [x] 制作历史:https://ontologie.capdataculture.fr/v1/owl/#HistoriqueProduction
- [x] 地点:https://ontologie.capdataculture.fr/v1/owl/#LieuGeographique
- [x] 媒体:https://ontologie.capdataculture.fr/v1/owl/#Media(不直接使用,使用子类)
- [√] 作品: https://ontologie.capdataculture.fr/v1/owl/#Oeuvre
- [√] 参与: https://ontologie.capdataculture.fr/v1/owl/#Participation
- [√] 作者: https://ontologie.capdataculture.fr/v1/owl/#Auteur
- [√] 技术和艺术合作: https://ontologie.capdataculture.fr/v1/owl/#Collaboration
- [√] 表演: https://ontologie.capdataculture.fr/v1/owl/#Interpretation
- [√] 作品管理: https://ontologie.capdataculture.fr/v1/owl/#MaitriseOeuvre
- [√] 生产提及: https://ontologie.capdataculture.fr/v1/owl/#MentionProduction
- [√] 合作伙伴关系: https://ontologie.capdataculture.fr/v1/owl/#Partenariat
- [√] 编排: https://ontologie.capdataculture.fr/v1/owl/#Programmation
- [√] 国家: https://ontologie.capdataculture.fr/v1/owl/#Pays
- [√] 个人: https://ontologie.capdataculture.fr/v1/owl/#Personne
- [√] 初步生产: https://ontologie.capdataculture.fr/v1/owl/#ProductionPrimaire
- [√] 生产: https://ontologie.capdataculture.fr/v1/owl/#Production
- [√] 角色: https://ontologie.capdataculture.fr/v1/owl/#Role
- [√] 季节: https://ontologie.capdataculture.fr/v1/owl/#Saison
- [√] 法律状态: https://ontologie.capdataculture.fr/v1/owl/#StatutJuridique
- [√] 作品类型: https://ontologie.capdataculture.fr/v1/owl/#TypeOeuvre
- [√] 事件类型: https://ontologie.capdataculture.fr/v1/owl/#TypeEvenement
- [√] 生产类型: https://ontologie.capdataculture.fr/v1/owl/#TypeProduction
- [√] 公众类型: https://ontologie.capdataculture.fr/v1/owl/#TypePublic
- [√] 活动: https://ontologie.capdataculture.fr/v1/owl/#Evenement
对于媒体,建议使用子类 Image
、Sound
和 Text
。
更详细的信息
数据不可变性
每个类的原始数据由一个 Value Object 表示,以验证数据并使其不可变。
基数
使用 Value Object 来表示数据,可以管理一个类属性的基数,通过构建一个代表值集合的 Value Object 而不是一个单一值。
所有 ValueObject
都可以接受一个基本类型或基本类型的数组。方法 __toString
和 __serialize
允许以强制方式获取基本类型的值或基本类型值的数组。
Value Object 负责验证输入数据。
<?php
$simpleString = new StringObject('foo');
$multipleString = new StringObject(['foo', 'bar']);
echo $simpleString; // 'foo'
echo $multipleString; // 'foo, bar' (concaténation des valeurs avec une virgule)
var_dump($simpleString->__serialize()); // ['foo']
var_dump($multipleString->__serialize()); // ['foo', 'bar']
与schema.org的对应关系
SDK 可以自动构建 CapData Opéra 和 schema.org 之间的某些本体之间的映射。
<https://mon-opera.fr/production/1>
a schema:Thing, rof:Production, schema:CreativeWork ;
rof:aPourInterpretation <https://mon-opera.fr/interpretation/1>, <https://mon-opera.fr/interpretation/2> ;
类属性
继承自 OntologyClass
的类的所有属性都是 ValueObject。因此,setter
接受以下内容:
- 一个基本类型的值
- 基本类型值的数组
- 代表一个值的
ValueObject
- 代表一个值集合的
ValueObject
getter
总是返回一个 ValueObject
。
<?php
use CapDataOpera\PhpSdk\ValueObject\StringObject;
use CapDataOpera\PhpSdk\Model\Personne;
$personne = new Personne('https://mon-opera.fr/person/1');
// Appels possibles pour ajouter une propriété :
// - Le setter wrap la valeur dans un ValueObject
$personne->setNom('foo');
// - On peut aussi passer un tableau de valeurs
$personne->setNom(['foo', 'bar']);
// - On passe directement un ValueObject
$personne->setNom(new StringObject('foo'));
// - On passe directement un ValueObject avec le tableau de valeurs
$personne->setNom(new StringObject(['foo', 'bar']));
// Le getter retourne toujours un ValueObject
$personne->getNom(); // StringObject('foo')
对象之间的关系
对象之间的关系由 RelationObject 表示,它们是表示集合的 ValueObject,在构建时进行类型检查以验证输入数据。
<?php
use CapDataOpera\PhpSdk\ValueObject\RelationObject;
use CapDataOpera\PhpSdk\Model\Fonction;
use CapDataOpera\PhpSdk\Model\Personne;
$fonction = new Fonction('https://mon-opera.fr/fonction/1');
$fonction2 = new Fonction('https://mon-opera.fr/fonction/2');
$personne = new Personne('https://mon-opera.fr/person/1');
// Appels possibles pour ajouter une relation :
// - Le setter wrap l'objet dans un RelationObject en définissant le type
$personne->setAPourFonction($fonction);
// - On peut aussi passer un tableau de valeurs
$personne->setAPourFonction([$fonction, $fonction2]);
// - On passe directement un RelationObject
$personne->setAPourFonction(new RelationObject($fonction, Fonction::class));
// - On passe directement un RelationObject avec le tableau de valeurs
$personne->setAPourFonction(new RelationObject([$fonction, $fonction2], Fonction::class));
外部关系
所有接受 RelationObject
的方法也接受通过 ExternalThing
类提供的资源外部 URI。
<?php
use CapDataOpera\PhpSdk\Model\Personne;
use CapDataOpera\PhpSdk\Model\ExternalThing;
$personne = new Personne('https://mon-opera.fr/person/1');
$personne->setAPourFonction(new ExternalThing('http://capdataculture.fr/graph/FONCTION/230'));
以下是用于外部关系的可用类:
CapDataOpera\PhpSdk\Model\ExternalThing
CapDataOpera\PhpSdk\Model\Isni
CapDataOpera\PhpSdk\Model\ArkBnf
使用这些类创建的对象不需要添加到图中进行序列化。
对象序列化
对象构建后,您必须将每个对象添加到 Graph
中。
$graph = new Graph();
$address = new AdressePostale('https://mon-opera.fr/adresse/1');
$address
->setAdressePostale('1 place de la Comédie')
->setCodePostal('69001')
->setCommune('Lyon')
;
$ownOrg = new Collectivite('https://mon-opera.fr/organization/1');
$ownOrg->setNom('Mon opéra de test')
->setFacebook('https://facebook.com/mon-opera')
->setSiteWeb('https://mon-opera.fr')
->setAdresse($address)
->setCatalogageSourceAgence($ownOrg)
->setDateCreationRessource(new \DateTimeImmutable('2022-01-30T00:00:00+00:00'))
->setDateModificationRessource(new \DateTimeImmutable('2024-01-30T00:00:00+00:00'))
->setIsni(new Isni('https://isni.org/isni/0000000122982840'));
$graph->add($address);
$graph->add($ownOrg);
图记录添加的每个对象的 URI 以避免重复,并验证每个关系是否已正确记录在图中。
构建图后,序列化器将使用 EasyRdf 库将每个对象转换为 RDF,并根据本体 https://ontologie.capdataculture.fr/v1/、https://schema.org/ 等. 这一阶段由 Converter
和 LiteralConverter
执行,它们负责通过责任链模式进行转换。
CapDataOpera\PhpSdk\Serializer\Serializer
类默认配置了一个 Converter
和 LiteralConverter
列表。但您可以为 RDF 添加属性或类来配置自己的 Converter
和 LiteralConverter
。
<?php
use CapDataOpera\PhpSdk\Serializer\Serializer;
// Serializer avec les converters par défaut
$serializer = new Serializer();
// Serializer des converters personnalisés
$serializer = new Serializer(
[
new MyCustomObjectConverter(),
],
[
new MyCustomLiteralConverter(),
]
);
最后,一旦图转换为 RDF,您就可以将其序列化为您选择的格式。这是 EasyRdf 支持的格式:https://www.easyrdf.org/docs/api/EasyRdf/Serialiser.html#method_serialise
<?php
// La méthode serialize effectue la conversion, la validation puis la sérialisation
echo $serializer->serialize($graph, 'turtle', ['capdata']);
添加自定义属性
您可以使用 addResource
方法在任何地方添加自定义属性到您的图中。
<?php
use CapDataOpera\PhpSdk\Graph\Graph;
use CapDataOpera\PhpSdk\Model\Collectivite;
use CapDataOpera\PhpSdk\Model\Isni;
use CapDataOpera\PhpSdk\Serializer\Serializer;
$serializer = new Serializer();
$graph = new Graph();
$ownOrg = new Collectivite('https://mon-opera.fr/organization/1');
$ownOrg->setNom('Mon opéra de test')
->setFacebook('https://facebook.com/mon-opera')
->setSiteWeb('https://mon-opera.fr')
->setCatalogageSourceAgence($ownOrg)
->setDateCreationRessource(new \DateTimeImmutable('2022-01-30T00:00:00+00:00'))
->setDateModificationRessource(new \DateTimeImmutable('2024-01-30T00:00:00+00:00'))
->setIsni(new Isni('https://isni.org/isni/0000000122982840'));
$graph->add($ownOrg);
/**
* Ajout d'une propriété personnalisée sur l'objet Collectivite
*/
$graph->addResource(
'https://mon-opera.fr/organization/1',
'https://schema.org/startDate',
new Literal('2016-04-21T20:00', null, 'xsd:dateTime')
);
echo $serializer->serialize($graph, 'turtle', ['capdata']);
选择序列化的本体
serialize
方法接受一个字符串数组来选择用于序列化的本体。可用的本体如下:
capdata
: https://ontologie.capdataculture.fr/v1/schema
: https://schema.org/
默认情况下,序列化器仅使用 capdata
本体。
<?php
use CapDataOpera\PhpSdk\Serializer\Serializer;
$serializer = new Serializer();
$graph = new Graph();
// ...
// Par défaut, exporte uniquement les classes et propriétés de l'ontologie capdata au format Turtle
echo $serializer->serialize($graph, 'turtle'/*, ['capdata'] */);
// les 2 ontologies sont utilisées
echo $serializer->serialize($graph, 'turtle', ['capdata', 'schema']);
// Exporte uniquement les classes et propriétés de l'ontologie schema.org au format LD-JSON pour le web sémantique
// L'export au format LD-JSON nécessite la librairie ml/json-ld: composer require ml/json-ld
echo $serializer->serialize($graph, 'jsonld', ['schema']);
如何为项目做出贡献
请阅读 CONTRIBUTING.md 了解更多关于我们的代码准则以及提交 pull-request 或 issue 的流程。
致谢
由法国 2030 年代号支持的项目 CapData Opéra - France 2030 完成,由法国歌剧协会负责。该活动由法国国家在 2030 年「现场表演增强体验」计划下支持,由法国存款银行运营。更多信息请访问 https://www.rof.fr/rof/capdata-opera.aspx。
SDK PHP 的设计与开发:Rezo Zero - https://www.rezo-zero.com/