甜rdf / rdfinterface2easyrdf
提供EasyRdf和rdfInterface对象之间转换的方法。
0.3.1
2024-04-09 18:12 UTC
Requires
- php: >=8.0
- sweetrdf/rdf-helpers: ^2.0.0
- sweetrdf/rdf-interface: ^2.0.0-RC1
Requires (Dev)
- php-coveralls/php-coveralls: ^2.4
- phpstan/phpstan: *
- phpunit/phpunit: ^9.5
- sweetrdf/easyrdf: ^1.4
- sweetrdf/quick-rdf: ^2.0.0-RC1
Suggests
- sweetrdf/easyrdf: ^1.4
- sweetrdf/quick-rdf: ^2.0.0-RC1
This package is auto-updated.
Last update: 2024-09-10 06:41:11 UTC
README
一个库,提供在EasyRdf(原始库,仍然维护的分支)和rdfInterface对象之间转换的方法(双向)。
特别有用,当你有太多EasyRdf代码需要迁移,但你希望使用rdfInterface生态系统来开发新代码时。
安装
- 获取 Composer
- 运行
composer require sweetrdf/rdfInterface2easyRdf
- 安装您选择的EasyRdf实现,例如
composer require sweetrdf/easyrdf
。 - 安装您选择的rdfInterface实现,例如
composer require sweetrdf/quick-rdf
。
用法
rdfInterface到EasyRdf
这种方向的转换很简单
- 如果你不关心严格的结果类型检查,只需使用
rdfInterface2easyRdf\AsEasyRdf::asEasyRdf()
方法,例如# let's prepare all kind of rdfInterface objects $blank = quickRdf\DataFactory::blankNode(); $named = quickRdf\DataFactory::namedNode('http://foo'); $literal = quickRdf\DataFactory::literal('bar', 'en'); $quad = quickRdf\DataFactory::quad($blank, $named, $literal); $dataset = new quickRdf\Dataset(); $dataset->add($quad); $node = $dataset->withTerm($named); print_r(rdfInterface2easyRdf\AsEasyRdf::AsEasyRdf($blank)); print_r(rdfInterface2easyRdf\AsEasyRdf::AsEasyRdf($named)); print_r(rdfInterface2easyRdf\AsEasyRdf::AsEasyRdf($literal)); echo rdfInterface2easyRdf\AsEasyRdf::AsEasyRdf($quad)->getGraph()->dump('text'); echo rdfInterface2easyRdf\AsEasyRdf::AsEasyRdf($node)->getGraph()->dump('text'); echo rdfInterface2easyRdf\AsEasyRdf::AsEasyRdf($dataset)->dump('text');
- 如果你想将转换后的数据附加到已存在的图中,请将其作为第二个参数传递,例如(继续上一个示例中的代码)
$graph = new EasyRdf\Graph(); $graph->resource('http://baz')->addLiteral('https://foo', 'other value'); rdfInterface2easyRdf\AsEasyRdf::AsEasyRdf($quad, $graph); echo $graph->dump('text');
- 如果你想将转换后的数据附加到已存在的图中,请将其作为第二个参数传递,例如(继续上一个示例中的代码)
- 如果你关心严格定义的返回数据类型,请使用
rdfInterface2easyRdf\AsEasyRdf::asLiteral()
,rdfInterface2easyRdf\AsEasyRdf::asResource()
和rdfInterface2easyRdf\AsEasyRdf::asGraph()
。- 它们只接受兼容的输入类型,例如
rdfInterface2easyRdf\AsEasyRdf::asLiteral()
只接受rdfInterface\LiteralInterface
rdfInterface\NodeInterface
既可以由rdfInterface2easyRdf\AsEasyRdf::asResource()
也可以由rdfInterface2easyRdf\AsEasyRdf::asGraph()
接受- 可以像
rdfInterface2easyRdf\AsEasyRdf::AsEasyRdf()
一样传递一个可选的第二个参数EasyRdf\Graph
(请参阅上面的示例)
- 它们只接受兼容的输入类型,例如
EasyRdf到rdfInterface
这种方向的转换可能很棘手。重要注意事项
- 由于rdfInterface只定义了一个接口但没有实际的实现,你必须始终传递一个RDF术语工厂对象(
$dataFactory
参数)。 - 由于rdfInterface没有定义创建数据集(
rdfInterface\DatasetInterface
)和数据集节点(rdfInterface\DatasetNodeInterface
)的标准方式,asRdfInterface()
方法返回一个rdfInterface\QuadIteratorInterface
,它是一个三元组迭代器。将EasyRdf\Resource
或EasyRdf\Graph
转换为数据集或数据集节点的方法是将EasyRdf对象中的三元组添加到现有的rdfInterface\DatasetInterface
或rdfInterface\DatasetNodeInterface
中。 可以使用add()
、addDataset()
和addDatasetNode()
方法来实现(请参阅下面的示例)。 - 关于
EasyRdf\Resource
转换存在歧义。你可能想将其转换为RDF术语(rdfInterface\BlankNode
或rdfInterface\NamedNode
)或者将其转换为一组三元组(四元组迭代器、数据集或数据集节点)。- 如果
EasyRdf\Resource
对象没有属性(没有三元组),则asRdfInterface()
方法将其转换为RDF术语,否则转换为rdfInterface\QuadIteratorInterface
。 - 使用
asTerm()
、asQuadIterator()
、add()
、addDataset()
或addDatasetNode()
来强制更具体的行为。
- 如果
以下示例中使用的EasyRdf图和术语工厂的示例
$graph = new EasyRdf\Graph(); $blank = $graph->resource('_:blank'); $res1 = $graph->resource('http://foo'); $res2 = $graph->resource('http://baz'); $res1->add('http://resource', $res2); $lit1 = new EasyRdf\Literal('literal', 'en'); $lit2 = new EasyRdf\Literal(1, null, 'http://www.w3.org/2001/XMLSchema#integer'); $res1->addLiteral('http://langLiteral', $lit1); $res1->addLiteral('http://intLiteral', $lit2); $res3 = $graph->resource('http://marry'); $res3->addLiteral('http://langLiteral', $lit1); $df = new quickRdf\DataFactory();
- 使用
asRdfInterface()
根据输入猜测输出类型。print_r(rdfInterface2easyRdf\AsRdfInterface::asRdfInterface($blank, $df)); # as $res2 contains no properties, it's converted to a named node print_r(rdfInterface2easyRdf\AsRdfInterface::asRdfInterface($res2, $df)); print_r(rdfInterface2easyRdf\AsRdfInterface::asRdfInterface($lit1, $df)); print_r(rdfInterface2easyRdf\AsRdfInterface::asRdfInterface($lit2, $df)); # as $res1 contains properties, it's converted to a quad iterator print_r(rdfInterface2easyRdf\AsRdfInterface::asRdfInterface($res1, $df)); foreach (rdfInterface2easyRdf\AsRdfInterface::asRdfInterface($res1, $df) as $i) { print_r($i); } # EasyRdf\Graph is also converted to a quad iterator print_r(rdfInterface2easyRdf\AsRdfInterface::asRdfInterface($graph, $df)); foreach (rdfInterface2easyRdf\AsRdfInterface::asRdfInterface($graph, $df) as $i) { print_r($i); }
- 使用
asTerm()
来强制将一个EasyRdf\Resource
转换为术语print_r(rdfInterface2easyRdf\AsRdfInterface::asRdfInterface($res1, $df)); print_r(rdfInterface2easyRdf\AsRdfInterface::asTerm($res1, $df));
- 有两种方法可以将
EasyRdf\Graph
和EasyRdf\Resource
转换为数据集echo $graph->dump('text'); # using quad iterator returned by the asRdfInterface() $dataset = new quickRdf\Dataset(); $dataset->add(rdfInterface2easyRdf\AsRdfInterface::asRdfInterface($graph, $df)); echo $dataset; # using add()/addDataset() method # (addDataset() works the same, just has strictly defined return type) $dataset = rdfInterface2easyRdf\AsRdfInterface::add($graph, $df, new quickRdf\Dataset()); echo $dataset; # similarly for an EasyRdf\Resource # (just only given resource triples are converted) $dataset = new quickRdf\Dataset(); $dataset->add(rdfInterface2easyRdf\AsRdfInterface::asRdfInterface($res1, $df)); echo $dataset; $dataset = rdfInterface2easyRdf\AsRdfInterface::add($res1, $df, new quickRdf\Dataset()); echo $dataset; # using add()/addDataset() we can also enforce # a whole graph to be converted based on an EasyRdf\Resource $dataset = rdfInterface2easyRdf\AsRdfInterface::add($res1, $df, new quickRdf\Dataset(), true); echo $dataset;
- 将
EasyRdf\Resource
转换为数据集节点相对最为复杂echo $graph->dump('text'); $emptyDatasetNode = new rdfHelpers\DatasetNode(new quickRdf\Dataset(), $df::blankNode()); $datasetNode = rdfInterface2easyRdf\AsRdfInterface::add($res1, $df, $emptyDatasetNode); print_r($datasetNode->getNode()); # the dataset attached to the dataset node contains all triples echo $datasetNode->getDataset(); # but the dataset node itself returns only triples of the converted EasyRdf\Resource foreach($datasetNode as $i) { echo "$i\n"; } # conversion could be limited to EasyRdf\Resource triples only using the $wholeGraph parameter $emptyDatasetNode = new rdfHelpers\DatasetNode(new quickRdf\Dataset(), $df::blankNode()); $datasetNode = rdfInterface2easyRdf\AsRdfInterface::add($res1, $df, $emptyDatasetNode, false); print_r($datasetNode->getNode()); # the dataset attached to the dataset node contains all triples echo $datasetNode->getDataset(); # addDatasetNode() works in the same way, just has narrower return type $emptyDatasetNode = new rdfHelpers\DatasetNode(new quickRdf\Dataset(), $df::blankNode()); $datasetNode = rdfInterface2easyRdf\AsRdfInterface::addDatasetNode($res1, $df, $emptyDatasetNode); print_r($datasetNode->getNode()); echo $datasetNode->getDataset();
- 在
add()
、addDataset()
和addDatasetNode()
的情形下,用于传递数据集/数据集节点的参数也可以接受一个可调用的对象,例如:$dataset = rdfInterface2easyRdf\AsRdfInterface::addDataset($res1, $df, fn() => new quickRdf\Dataset()); $datasetNode = rdfInterface2easyRdf\AsRdfInterface::addDatasetNode( $res1, $df, fn($x) => new rdfHelpers\DatasetNode(new quickRdf\Dataset(), $x) );