0

我正在尝试EasyRdf_Graph从通过发送的查询中获取对象EasyRdf_Sparql_Client::query

EasyRDF 文档说

SELECTASK查询将返回一个类型的对象EasyRdfSparqlResult

CONSTRUCTDESCRIBE查询将返回一个类型的对象EasyRdf_Graph

这是我的代码:

<?php
require APPPATH .'third_party/vendor/autoload.php';        
$endpointUrl = "http://data.bnf.fr/sparql";        
$dummyConstructQueryString = "construct { ?s ?q ?r } where { ?s ?p ?o . ?o ?q ?r } limit 1";        
$endPoint = new EasyRdf_Sparql_Client($endpointUrl);
$result = $endPoint->query($dummyConstructQueryString);                
var_dump($result);
echo $result;
?>

这是输出,EasyRdf_Sparql_Result如您所见:

object(**EasyRdf_Sparql_Result**)#47 (6) {
  ["type":"EasyRdf_Sparql_Result":private]=>
  string(8) "bindings"
  ["boolean":"EasyRdf_Sparql_Result":private]=>
  NULL
  ["ordered":"EasyRdf_Sparql_Result":private]=>
  NULL
  ["distinct":"EasyRdf_Sparql_Result":private]=>
  NULL
  ["fields":"EasyRdf_Sparql_Result":private]=>
  array(3) {
    [0]=>
    string(1) "s"
    [1]=>
    string(1) "p"
    [2]=>
    string(1) "o"
  }
  ["storage":"ArrayIterator":private]=>
  array(1) {
    [0]=>
    object(stdClass)#48 (3) {
      ["s"]=>
      object(EasyRdf_Resource)#49 (2) {
        ["uri":protected]=>
        string(56) "http://www.w3.org/ns/sparql-service-description#endpoint"
        ["graph":protected]=>
        NULL
      }
      ["p"]=>
      object(EasyRdf_Resource)#50 (2) {
        ["uri":protected]=>
        string(47) "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"
        ["graph":protected]=>
        NULL
      }
      ["o"]=>
      object(EasyRdf_Resource)#51 (2) {
        ["uri":protected]=>
        string(42) "http://www.w3.org/2000/01/rdf-schema#Class"
        ["graph":protected]=>
        NULL
      }
    }
  }
}
+-------------+----------+------------+
| ?s          | ?p       | ?o         |
+-------------+----------+------------+
| sd:endpoint | rdf:type | rdfs:Class |

还尝试了不同的端点(http://dbpedia.org/sparqlhttp://localhost:3030/testFuseki) 因为我看到了这个问题:https ://github.com/njh/easyrdf/issues/226 ,但它是一样的。

有关安装的信息

  • 随 Composer 一起安装的 EasyRDF 版本 0.9.1

  • PHP 版本 7.0.30-0+deb9u1 + Apache/2.4.25 (Debian)

任何线索将不胜感激,在此先感谢。


编辑

实际上它适用于我本地安装的 Fuseki。由于http://data.bnf/fr/sparqlhttp://dbpedia.org/sparql都是 Virtuoso 端点,我想知道问题是否仅出在 Virtuoso 上。

4

2 回答 2

1

问题由 EasyRDF 发出的 HTTP 请求标头揭示并发布在您的答案中(所有这些附加细节实际上都应该编辑到您的问题中)。

EasyRDF 请求头——

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

-- 表示 EasyRDF 同样乐于接收text/htmlor application/xhtml+xml,然后更喜欢application/xml, 后跟*/*or “任何媒体类型”。

事实并非如此! text/html不是EasyRDF 想要的,而且在这种情况下,它绝对不是一样好application/xhtml+xml或更好application/xml

也就是说,Virtuoso 完全按照 EasyRDF 的要求进行操作,并且交付了text/html……EasyRDF 毫不奇怪地将其视为图表。

你只是幸运地从 Fuseki 得到了回报(这application/n-quads不是 EasyRDF 要求的任何特定 MIME 类型)

EasyRDF应该请求一些 RDF MIME 类型(例如text/turtle, application/rdf+xml, application/trig, application/n-triples, application/n-quads, application/ld+json, sparql-results+xml... 并非所有这些类型都被 EasyRDF 实际支持,因此不应简单地将这个列表放入该Accept:标头中)。EasyRDF 还应该指出这些(可能具有内部优先顺序)优先于任何非 RDF MIME 类型(包括 EasyRDF 当前请求的所有特定 MIME 类型)或通配符 ( */*)。

这应该报告为 EasyRDF 中的错误。随意在你的报告中标记我( @TallTed on github )。

于 2018-09-11T21:06:56.277 回答
0

感谢 Ted 关于标题和更新 EasyRDF 的建议,我在阅读了有关 EasyRDF 问题 #226 的更多信息后找到了解决方案。问题是它需要重新编写 php 代码以使用新的命名空间等。如果有人知道 0.9.1 版本的解决方案,那将非常有帮助!

似乎返回的对象类型(EasyRdf_Graph/ EasyRdf_Sparql_Result)取决于Accept标头的参数。我尝试通过 Firebug 修改它(添加Virtuoso doc中列出的不同内容类型 )并重新发送请求,但EasyRdf_GraphVirtuoso 尚未获得任何对象。


正如 Ted 所问,这是请求标头的相关部分(带有上述 php 代码和 EasyRDF 0.0.1):

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive

为了获取端点响应标头,我添加了这一行:

print_r(get_headers($endpointUrl));

以下是 Fuseki 的响应标头(它给出了一个EasyRdf_Graph对象):

[0] => HTTP/1.1 200 OK
[1] => Date: Tue, 11 Sep 2018 06:14:56 GMT
[2] => Fuseki-Request-ID: 13
[3] => Vary: Accept,Accept-Encoding,Accept-Charset
[4] => Content-Type: application/n-quads
[5] => Vary: User-Agent

对于 Virtuoso ( http://data.bnf.fr )

[0] => HTTP/1.1 302 Found
[1] => Date: Tue, 11 Sep 2018 06:12:29 GMT
[2] => Server: Apache
[3] => Location: http://data.bnf.fr/sparql/
[4] => Content-Length: 210
[5] => Content-Type: text/html; charset=iso-8859-1
[6] => Vary: Accept-Encoding,User-Agent
[7] => Connection: close
[8] => HTTP/1.1 200 OK
[9] => Date: Tue, 11 Sep 2018 06:12:29 GMT
[10] => Server: Apache
[11] => Last-Modified: Mon, 19 Feb 2018 10:34:21 GMT
[12] => ETag: "200036-3a99-5658e3ca8a540"
[13] => Accept-Ranges: bytes
[14] => Content-Length: 15001
[15] => Vary: Accept-Encoding,User-Agent
[16] => Access-Control-Allow-Origin: *
[17] => Content-Type: text/html
[18] => Content-Language: fr
[19] => Connection: close

注意:对于 data.bnf.fr,代码是 302(重定向),但似乎没有任何区别,请参阅 dbpedia 响应:

[0] => HTTP/1.1 200 OK
[1] => Date: Tue, 11 Sep 2018 07:17:23 GMT
[2] => Content-Type: text/html; charset=UTF-8
[3] => Content-Length: 14172
[4] => Connection: close
[5] => Vary: Accept-Encoding
[6] => Server: Virtuoso/07.20.3229 (Linux) i686-generic-linux-glibc25-64  VDB
[7] => Expires: Tue, 18 Sep 2018 07:17:23 GMT
[8] => Cache-Control: max-age=604800
[9] => Access-Control-Allow-Origin: *
[10] => Access-Control-Allow-Credentials: true
[11] => Access-Control-Allow-Methods: GET, POST, OPTIONS
[12] => Access-Control-Allow-Headers: DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Accept-Encoding
[13] => Accept-Ranges: bytes

所以这是使用新的 php 代码和 composer 更新来获得 EasyRDF dev-master 的解决方案:

1) 编辑 composer.json :

{
    "require": {
        "easyrdf/easyrdf": "dev-master"
    }
}

2)运行

php composer.phar update

3)重写php代码:

require_once './third_party/vendor/autoload.php';
$endpointUrl = "http://data.bnf.fr/sparql";        
$dummyConstructQueryString = "construct { ?s ?q ?r } where { ?s ?p ?o . ?o ?q ?r } limit 1";        
$endPoint = new \EasyRdf\Sparql\Client($endpointUrl); // <-- here use the namespace
$result = $endPoint->query($dummyConstructQueryString);                
var_dump($result);

编辑

最后我不确定http请求头参数“Accept”是否是获取EasyRdf_Graph对象的条件。以下是更新后的 Easyrdf 代码(“dev-master”版本)的请求和响应标头。也许 EasyRDF 会解析查询和结果来构建一个EasyRdf_Graph对象。

  • 要求

     Host: localhost
     User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0
     Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
     Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3
     Accept-Encoding: gzip, deflate
     DNT: 1
     Connection: keep-alive
     Upgrade-Insecure-Requests: 1
     Cache-Control: max-age=0
    
  • 来自http://data.bnf.fr/sparql/的响应(通过 获得print_r(get_headers($endpointUrl));

     [0] => HTTP/1.1 302 Found
     [1] => Date: Wed, 12 Sep 2018 06:21:48 GMT
     [2] => Server: Apache
     [3] => Location: http://data.bnf.fr/sparql/
     [4] => Content-Length: 210
     [5] => Content-Type: text/html; charset=iso-8859-1
     [6] => Vary: Accept-Encoding,User-Agent
     [7] => Connection: close
     [8] => HTTP/1.1 200 OK
     [9] => Date: Wed, 12 Sep 2018 06:21:48 GMT
     [10] => Server: Apache
     [11] => Last-Modified: Mon, 19 Feb 2018 10:34:21 GMT
     [12] => ETag: "200036-3a99-5658e3ca8a540"
     [13] => Accept-Ranges: bytes
     [14] => Content-Length: 15001
     [15] => Vary: Accept-Encoding,User-Agent
     [16] => Access-Control-Allow-Origin: *
     [17] => Content-Type: text/html
     [18] => Content-Language: fr
     [19] => Connection: close
    
于 2018-09-11T07:32:54.453 回答