甜RDF/SPARQL客户端

0.6.2 2023-09-01 15:26 UTC

README

Latest Stable Version Build status Coverage Status License

一个SPARQL客户端库,用于rdfInterface生态系统,API灵感来源于PDO

  • 它可以与任何符合PSR-17/PSR-18的HTTP库一起工作。
  • 它可以处理大量查询结果。
    响应以懒加载方式作为流进行解析(只有当您尝试读取时才会解析下一行)。这确保在迭代结果时不会在数组中累积它们,从而具有可忽略的内存占用。

安装

  • 获取Composer
  • 运行composer require sweetrdf/sparql-client
  • 运行composer require guzzlehttp/guzzle来安装HTTP客户端(但您可以使用任何支持PSR-18的客户端)。
  • 运行composer require http-interop/http-factory-guzzle来安装Guzzle的PSR-17绑定(但您可以使用任何PSR-17实现)。
  • 运行composer require sweetrdf/quick-rdf来安装RDF术语工厂(您可以使用任何与rdfInterface兼容的术语工厂)。

自动生成的文档

https://sweetrdf.github.io/sparqlClient/namespaces/sparqlclient.html

它非常不完整,但总比没有好。
包含RdfInterface文档,它提供了术语(表示RDF命名节点的对象、字面量等)的文档。

使用方法

include 'vendor/autoload.php';
$connection = new \sparqlClient\StandardConnection('https://query.wikidata.org/sparql', new \quickRdf\DataFactory());
$results    = $connection->query('select * where {?a ?b ?c} limit 10');
foreach ($results as $i) {
    print_r($i);
}

参数化查询

StandardConnection类提供了一个类似PDO的API,用于参数化查询(也称为预处理语句)。参数化查询

  • 是确保SPARQL查询中所有命名节点/空白节点/字面量/四元组等正确转义的正确方式。
  • 保护免受SPARQL注入攻击。
  • 不会提供任何速度提升(与SQL参数化查询相反)。
include 'vendor/autoload.php';
$factory    = new \quickRdf\DataFactory();
$connection = new \sparqlClient\StandardConnection('https://query.wikidata.org/sparql', $factory);

// pass parameters using execute()
// the single `?` is a positional parameter while the `:sf` is a named parameter
$query      = $connection->prepare('SELECT * WHERE {?a ? ?c . ?a :sf ?d .} LIMIT 10');
$query->execute([
    $factory::namedNode('http://creativecommons.org/ns#license'),
    'sf' => $factory::namedNode('http://schema.org/softwareVersion'),
]);
foreach ($query as $i) {
    print_r($i);
}

// bind a (positional) parameter to a variable
$query = $connection->prepare('SELECT * WHERE {?a ? ?c .} LIMIT 2');
$value = $factory::namedNode('http://creativecommons.org/ns#license');
$query->bindParam(0, $value);
$query->execute();
foreach ($query as $i) {
    print_r($i);
}
$value = $factory::namedNode('http://schema.org/softwareVersion');
$query->execute();
foreach ($query as $i) {
    print_r($i);
}

与PDO API有一些不同

  • 在一个查询中混合位置参数和命名参数是允许的(见上面的示例)。
  • 混合bindParam()/bindValue()并通过execute()传递(一些或所有)参数是允许的。
    • 唯一的约束是所有参数都必须设置。
    • 传递给execute()的参数将覆盖使用bindParam()/bindValue()设置的参数。
  • 由于使用强类型,参数值必须是rdfInterface\Term类型。
    • 这使得在bindParam()/bindvalue()中指定类型变得不必要。

高级使用

  • 您还可以向\sparqlClient\StandardConnection构造函数提供任何PSR-18 HTTP客户端和/或PSR-17 HTTP请求工厂。例如,假设您的SPARQL端点需要授权,并且您想利用Guzzle连接来设置全局请求选项
    $connection = new \sparqlClient\StandardConnection(
        'https://query.wikidata.org/sparql', 
        new \quickRdf\DataFactory(),
        new \GuzzleHttp\Client(['auth' => ['login', 'pswd']])
    );
  • 如果您的SPARQL端点不遵循接受SPARQL查询作为query请求参数的事实标准,您可以使用\sparqlClient\Connection类,该类接受PSR-7请求而不是查询字符串,并允许您使用所需的任何特定HTTP请求。

常见问题解答

  • 关于INSERT/UPDATE/DELETE查询与\rdfInterface\Dataset或\rdfInterface\QuadIterator的集成怎么办?
    将在将来添加。