甜味rdf/rdfinterface2easyrdf

提供在EasyRdf和rdfInterface对象之间进行转换的方法。

0.3.1 2024-04-09 18:12 UTC

This package is auto-updated.

Last update: 2024-09-10 06:41:11 UTC


README

Latest Stable Version Build status Coverage Status License

一个库,提供在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()接受
    • EasyRdf\Graph可以作为可选的第二个参数传递,就像在rdfInterface2easyRdf\AsEasyRdf::AsEasyRdf()中一样(参见上面的示例)

EasyRdf到rdfInterface

向此方向的转换可能有点棘手。重要说明

  • 由于rdfInterface只定义了一个接口而没有实际实现,您必须始终传递一个RDF术语工厂对象($dataFactory参数)。
  • 由于rdfInterface没有定义创建数据集(rdfInterface\DatasetInterface)和数据集节点(rdfInterface\DatasetNodeInterface)的标准方式,asRdfInterface()方法返回一个rdfInterface\QuadIteratorInterface,它是一个三元组迭代器。EasyRdf\ResourceEasyRdf\Graph转换为数据集或数据集节点的唯一方法是向现有的rdfInterface\DatasetInterfacerdfInterface\DatasetNodeInterface添加三元组。 可以使用add()addDataset()addDatasetNode()方法进行此操作(请参阅下面的示例)。
  • 关于EasyRdf\Resource转换存在歧义。您可能想要将其转换为RDF术语(rdfInterface\BlankNoderdfInterface\NamedNode)或将其转换为一组三元组(四元组迭代器、数据集或数据集节点)。
    • asRdfInterface()方法在EasyRdf\Resource对象没有属性(没有三元组)时将其转换为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\GraphEasyRdf\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)
    );