PHP EasyRDF: невозможно получить график из запроса конструкции - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь получить объект EasyRdf_Graph из запроса, отправленного через EasyRdf_Sparql_Client::query.

В документе EasyRDF написано :

SELECT и ASK запросы вернут объект типа EasyRdfSparqlResult.

CONSTRUCT и DESCRIBE запросы вернут объект типа 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/sparql и http://localhost:3030/testFuseki), потому что я видел эту проблему: https://github.com/njh/easyrdf/issues/226,, но это то же самое.

Информация об установке

  • EasyRDF версии 0.9.1, установленная с Composer

  • Версия PHP 7.0.30-0 + deb9u1 + Apache / 2.4.25 (Debian)

Любая подсказка будет признательна, спасибо заранее.


EDIT

На самом деле работает с моей локальной установкой Fuseki . Поскольку http://data.bnf/fr/sparql и http://dbpedia.org/sparql являются конечными точками Virtuoso, мне интересно, если проблема только в Virtuoso.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Проблема проявляется в заголовках HTTP-запроса, отправляемых EasyRDF и публикуемых в вашем ответе (все эти дополнительные сведения должны быть фактически отредактированы в вашем вопросе).

Заголовок запроса EasyRDF -

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

- говорит, что EasyRDF одинаково рад получить text/html или application/xhtml+xml, а затем предпочтет application/xml, за которым следует */* или "любой тип носителя".

Это на самом деле не так! text/html - это , а не , чего хочет EasyRDF, и он определенно не так хорош, как application/xhtml+xml, и не лучше, чем application/xml в этом контексте.

Тем не менее, Virtuoso выполняет в точности то, что запрашивает EasyRDF, и доставляет text/html ... что неудивительно, что EasyRDF не воспринимает это как график.

Вам просто повезло в том, что вы получаете от Fuseki (то есть application/n-quads, который не является ни одним из определенных типов MIME, запрашиваемых EasyRDF)

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 также должен указывать, что они (возможно, с внутренним порядком предпочтений) предпочтительнее любых типов MIME, не относящихся к RDF (включая все конкретные типы MIME, которые EasyRDF запрашивает в настоящее время), или групповых символов (*/*).

Это должно быть зарегистрировано как ошибка в EasyRDF . Не стесняйтесь отмечать меня ( @ TallTed на github ) в своем отчете.

0 голосов
/ 11 сентября 2018

Благодаря предложению Теда о заголовках и обновлении EasyRDF я нашел решение после прочтения немного больше о проблеме EasyRDF # 226. Проблема в том, что требуется переписать код php для использования новых пространств имен и т. Д. Если кто-нибудь знает решение с версией 0.9.1, это было бы очень полезно!

Похоже, что возвращаемый тип объекта (EasyRdf_Graph / EasyRdf_Sparql_Result) зависит от параметра Accept заголовков. Я попытался изменить его (добавил различные типы контента, перечисленные в Virtuoso doc ) через Firebug и повторно отправить запрос, но пока не получал объект EasyRdf_Graph с Virtuoso.


Как спросил Тед, вот соответствующая часть заголовков запроса (с приведенным выше кодом 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

А для Виртуоза (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

N.B. : для 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 и обновлением композитора , чтобы получить 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);

EDIT

Наконец, я не уверен, что параметр заголовка 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
    
...