botk/rdf

此软件包已被废弃,不再维护。未建议替代软件包。

EasyRdf 扩展,支持某些 Sparql 端点的身份验证和推理。

4.1.1 2016-03-28 08:21 UTC

This package is not auto-updated.

Last update: 2022-02-01 12:28:22 UTC


README

本项目支持现已停止。请更新您的链接。

作为标记分支找到旧版本。

BOTK\Rdf

Build Status Code Coverage Latest Version Total Downloads License

此软件包是 EasyRDF 的扩展,支持身份验证、推理、LDP 服务器端点和更多功能。

它扩展了 EasyRDF 的默认 httpclient,支持基本身份验证,并提供两种内容协商策略,用于管理 RDF 图和 Sparql 结果数据模型的一致表示。

除此之外,它还包含一个简单的端点实现,支持许多序列化和 HTML,遵循Linked Data Platform Editor Draft 规范

此软件包可在 Packagist 上找到。

您可以通过将以下依赖项添加到项目根目录中的 composer.json 文件来安装

    {
      "require": {
        "botk/rdf": "*"
      }
    }

文档

HttpClient 类

此类是EasyRDF http 客户端类的替代品。它添加了 setAuth(string $user, string $password) 方法,支持基本 http 身份验证类型。HttpClient 是 Zend_Http_clientGuzzle 库的轻量级替代品。

HttpClient 通常用作所有 EasyRDF 专用客户端和 SparqlClient 的 HTTP 协议包装器,通过 EasyRdf_Http::setDefaultHttpClient() 方法,但它也可以用作通用 Web 资源客户端。

例如,要使用简单客户端身份访问远程 Sparql 端点,请执行以下操作

// define common properties of http client to use to access RDF web resources
$httpClient = new BOTK\RDF\HttpClient;
$httpClient->setAuth('username', 'password');
EasyRdf_Http::setDefaultHttpClient($httpClient);

// access a private sparql end-point that requires basic authentication
$sparql = new EasyRdf_Sparql_Client('https://private/sparql');
$result=$sparql->query('SELECT * WHERE {?s ?p ?o} LIMIT 10');

HttpClient 接口与 ZEND-Http_client 库 兼容。

HttpClient 提供了一个简单的辅助器,通过单个静态方法调用 HttpClient::useIdentity(string $usename = null, string $password=null, $timeout=null ) 来创建一个经过身份验证的 HTTP 客户端并在 EasyRdf 中使用它。如果没有指定,客户端将重用调用脚本的超时时间(如果可用)或 30 秒。使用辅助器,前面的代码可以缩短为

BOTK\RDF\HttpClient::useIdentity('username','password');

$sparql = new EasyRdf_Sparql_Client('https://private/sparql');
$result=$sparql->query('SELECT * WHERE {?s ?p ?o} LIMIT 10');

.

内容协商策略

RDF

此内容协商策略是为使用 EasyRff_Graph 数据结构作为资源模型的程序设计的。

它提供以下响应和请求表示

  RDF class define following renderer functions: 
RDF::turtleRenderer(mixed $data, Standard::n3Renderer(mixed $data)
将数据结构序列化为 RDF 文本/turtle
RDF::rdfxmlRenderer(mixed $data)
将数据结构序列化为 RDF application/xml+rdf。
RDF::jsonRenderer(mixed $data)
使用json序列化数据结构
RDF::ntriplesRenderer(mixed $data)
序列化RDF ntriples数据结构。
RDF::htmlRenderer(mixed $data)
将数据结构序列化为HTML。
RDF::serialphpRenderer(mixed $data)
将数据结构序列化为PHP。

SparqlClientResult

本内容协商策略是为使用EasyRdf_Sparql_Result数据结构作为资源模型的应用程序设计的。

它提供以下响应和请求表示

简单链接数据平台服务器(SLDPS)

这一组类允许您根据最新的链接数据平台工作组草案规范实现一个简单的端点以发布链接数据。提供的类可以用来作为链接数据平台服务器实现的基础。

这是一个实现LDP分页服务器的简单脚本

    class MyRouter extends EndPoint
    {  
        protected function setRoutes() 
        {
            $this->get('/', 'ProductsController')
                ->accept(RDF::renderers())
                ->through($this->representationCachingProcessor(Caching::SHORT));
        }
    }

    class ProductsController extends SparqlLDPController
    {
        protected 
            $pagesize       = 10,
            $pagingPolicy   = self::CONSERVATIVE,
            $endpoint       = 'http://linkedopencommerce.com/sparql/',
            $constructor    = '
                PREFIX gr:  <http://purl.org/goodrelations/v1#>
                DESCRIBE ?product WHERE {
                    ?product a gr:ProductOrServiceModel.  
                }
            ';
    }

    $errorManager = BOTK\Core\ErrorManager::getInstance()->registerErrorHandler();    
    try {                                                      
        echo BOTK\Core\EndPointFactory::make('MyRouter')->run();
    } catch ( Exception $e) {
        echo $errorManager->render($e); 
    }

LDPController类

该类提供了一个通用的抽象实现LDP分页控制器。为了得到一个有效的实现,您必须实现三个方法

  • detectIfHasNextPage():如果存在另一个链接数据页面,则必须返回true。如果未提供,则禁用分页功能。
  • linkData():将受保护的变量resultGraph(一个EasyRdf_Graph对象)填充为链接资源
  • linkMetaData():可选地添加元数据到resultGraph

它提供了一个简单的模板引擎(来自核心包),其中包含一组预定义的变量占位符

  • {pagedResourceUri}:请求的uri,不包含页面信息
  • {strippedUri}:请求的uri,不包含查询字符串和片段
  • {requestUri}:用户输入的请求uri(包含或不包含部分页面信息)

受保护的context变量包含一个Core PagedResourceContext的实例。

SparqlLDPController类

该类扩展了LDPController,提供了一个通用的Linked Data Platform服务器实现,该服务器将Sparql服务器中包含的一些资源发布为链接数据资源。

您需要重定义以下变量以覆盖默认值

$username
访问Sparql更新端点所需的用户名,默认为空
$password
访问Sparql更新端点所需的密码。仅支持基本方法,默认为空
$endpoint
Sparql端点uri。默认为空。有效的公开Sparql端点示例有:http://dbpedia.org/sparqlhttp://lod.openlinksw.com/sparqlhttp://linkedopencommerce.com/sparql
$pagingPolicy
这是一个字符串值,可以是`AGGRESSIVE`或`CONSERVATIVE`,用于驱动下一页检测算法。默认为AGGRESSIVE
$constructor
必须包含一个有效的sparq查询模板,该模板构建一个包含链接数据的图。不要包含LIMIT/OFFSET子句。默认为空。
$metadata
可选地包含一个turtle模板,用于分页资源的元数据。默认为空

SparqlLDPController类实现了LDPController抽象方法

  • 它提供了一个基于参数算法的detectIfHasNextPage()实现,该算法使用$pagingPolicy变量。如果$pagingPolicy=AGGRESSIVE,则当向Sparql服务器发出的最后一个查询结果正好为$pagesize个三元组时,返回true,否则返回false。如果$ pagingPolicy=CONSERVATIVE,当向Sparql服务器发出的最后一个查询不为空时返回true。
  • 它基于$selector变量中的SPARQL查询实现了linkData()方法。
  • 它基于$metadata变量中的turtle模板实现了linkMedtadata()方法。

除此之外,SparqlLDPController类还实现了以下功能

  • get($resourceId=null):一个默认的控制器获取方法,带有由路由器设置的可选参数。

此类向简单模板引擎添加以下预定义变量占位符

  • {endpoint}:同名变量的值。
  • {limit}:与PagedResouceContext::getPageSize()的值相同。
  • {offset}:一个计算值,作为PagedResouceContext::getPageNum() * PagedResouceContext::getPageSize()。
  • {username}:同名变量的值。
  • {containerUri}:从{strippedUri}中提取的容器猜测URI。
  • {resourceId}:路由器模板变量参数的值。如果resouceId是数组,则使用implode('/',$resourceId) PHP指令将其转换为字符串。
  • {encodedResourceId}:与{resourceId}相同,但进行了URL编码。

您可以在$constructor和$metadata模板中使用这些变量以及LDPController中定义的变量。

    Here is a full example of a contanainer/resource LDP-PAGING implementation using void and prov ontology to
    annotate resources:
    class MyRouter extends EndPoint
    {  
        protected function setRoutes()
        {
            $this->get('/', 'DatasetController');
            $this->get('/*','DataDumpController');

            $this->always('Accept', RDF::renderers() );
            $this->always('Through', $this->representationCachingProcessor(Caching::SHORT));
        }
    }

    class DataDumpController extends SparqlLDPController
    {
        protected $endpoint = 'http://lod.openlinksw.com/sparql';

        protected $constructor  = '
            PREFIX ld: <http://e-artspace.com/s/eCloud#>
            CONSTRUCT {
              ?ldpr ?p ?o . 
            } WHERE { 
                GRAPH <http://e-artspace.com/s/eCloud/> {
                    ?ldpr ?p ?o
                    FILTER (?ldpr = ld:{resourceId} )
                }
            } LIMIT {limit} OFFSET {offset}
        ';

        protected $metadata = '     
            @base <{pagedResourceUri}> .
            @prefix foaf: <http://xmlns.com/foaf/0.1/> .
            @prefix void: <http://rdfs.org/ns/void#> .
            @prefix prov: <http://www.w3.org/ns/prov#> .
            @prefix ldp:  <http://www.w3.org/ns/ldp#> .
            @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
            @prefix container:  <{containerUri}#> .
            @prefix ld: <http://e-artspace.com/s/eCloud#> .
            <> a ldp:Resource, foaf:Document, prov:Entity ;
                foaf:primaryTopic ld:{resourceId} ;
                void:inDataset container:dataset ;
                rdfs:seeAlso <{endpoint}?query=DESCRIBE%20%3Chttp%3A%2F%2Fe-artspace.com%2Fs%2FeCloud%23{encodedResourceId}%3E> ;
                prov:wasGeneratedBy [
                    a prov:Activity ;
                    prov:used <{queryResource}> ;
                    prov:wasAssociatedWith container:sparqlServerUser ;
               ]
            .    
         ';    
    }    

    class DatasetController extends SparqlLDPController
    {
        protected $type     = 'DirectContainer';
        protected $endpoint = 'http://lod.openlinksw.com/sparql';

        protected $constructor  = '
            PREFIX void: <http://rdfs.org/ns/void#>
            PREFIX ldp:  <http://www.w3.org/ns/ldp#>
            CONSTRUCT {
              <{pagedResourceUri}#dataset> void:dataDump ?ldpr .
            } WHERE {
                GRAPH <http://e-artspace.com/s/eCloud/> {
                    ?resource a ?type
                    FILTER(!isBlank(?resource))
                }        
                BIND( IRI(REPLACE(STR(?resource), "http://e-artspace.com/s/eCloud#","{strippedUri}")) AS ?ldpr)
            }
        ';

        protected $metadata = '     
            @base <{pagedResourceUri}> .
            @prefix foaf: <http://xmlns.com/foaf/0.1/> .
            @prefix void: <http://rdfs.org/ns/void#> .
            @prefix prov: <http://www.w3.org/ns/prov#> .
            @prefix ldp:  <http://www.w3.org/ns/ldp#> .
            @prefix : <#> .
            <>  a ldp:DirectContainer, foaf:Document ;
                foaf:primaryTopic :dataset ;
                ldp:membershipResource :dataset ;
                ldp:hasMemberRelation void:dataDump ;
                ldp:insertedContentRelation foaf:primaryTopic ;

            .
            :dataset a void:Dataset, prov:Entity ;
                prov:wasGeneratedBy [
                    a prov:Activity ;
                    prov:used <{queryResource}> ;
                    prov:wasAssociatedWith :sparqlServerUser
                ]
            .
            :sparqlServerUser a foaf:Agent;
                foaf:account [
                    a foaf:OnlineAccount ;
                    foaf:accountServiceHomepage <{endpoint}> ;
                    foaf:accountname "{username}" ;
                ]
            .
         ';
    }

    $errorManager = BOTK\Core\ErrorManager::getInstance()->registerErrorHandler();    
    try {                                                      
        echo BOTK\Core\EndPointFactory::make('MyRouter')->run();
    } catch ( Exception $e) {
        echo $errorManager->render($e); 
    }

许可证

版权所有©2016年,由Enrico Fagnoni在LinkedData.Center®

在此,任何人获得本软件和相关文档文件(“软件”)的副本,均可免费处理该软件,不受限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许向软件提供的人这样做,但需遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“现状”提供,不提供任何形式的保证,无论是明示的还是暗示的,包括但不限于适销性、适用于特定目的和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论这些索赔、损害或其他责任是因合同行为、侵权行为或其他行为引起的,无论这些索赔、损害或其他责任是否与软件或其使用或其他方式有关。