2017-04-30 2 views
0

C'est ma première question. Je fais un programme simple pour interroger DBpedia. J'utilise PHP API + EasyRdf RDF Library for PHP.EasyRDF - SPARQL interrogation DBpedia - Erreur "préfixe d'espace de noms non défini"

La requête SPARQL est correcte; ça fonctionne bien sur http://dbpedia.org/snorql. Je peux utiliser la requête pour l'exemple d'API; c'est aussi correct. Je prefix avec dbo, foaf, rdfs ...

Mais quand j'utilise cette requête avec cette condidion ?person dbo:birthPlace :Berlin ., j'ai cette erreur:

Fatal error:

Uncaught exception 'EasyRdf_Exception' with message 'HTTP request for SPARQL query failed:

Virtuoso 37000 Error SP030: SPARQL compiler, line 4: Undefined namespace prefix at '' before '.' SPARQL query: define sql:big-data-const 0 PREFIX foaf: PREFIX rdfs: PREFIX dbo: SELECT ?name ?person WHERE { ?person a dbo:MusicalArtist . ?person dbo:birthPlace :Berlin . ?person foaf:name ?name . ?person rdfs:comment ?description . } ORDER BY ?name' in D:\xampp\htdocs\HelloComposer\lib\EasyRdf\Sparql\Client.php:290 Stack trace: #0 D:\xampp\htdocs\HelloComposer\lib\EasyRdf\Sparql\Client.php(120): EasyRdf_Sparql_Client->request('query', 'SELECT ?name ?p...') #1 D:\xampp\htdocs\dbpedia\index.php(43): EasyRdf_Sparql_Client->query('SELECT ?name ?p...') #2 {main} thrown in D:\xampp\htdocs\HelloComposer\lib\EasyRdf\Sparql\Client.php on line 290

Mon code PHP -

<?php 



require_once('D:\xampp\htdocs\HelloComposer\lib\EasyRdf.php'); 
require_once ('D:\xampp\htdocs\HelloComposer\lib\html_tag_helpers.php'); 

//PREFIX 

EasyRdf_Namespace::set('category', 'http://dbpedia.org/resource/Category:'); 
EasyRdf_Namespace::set('dbpedia', 'http://dbpedia.org/resource/'); 
EasyRdf_Namespace::set('dbo', 'http://dbpedia.org/ontology/'); 
EasyRdf_Namespace::set('dbp', 'http://dbpedia.org/property/'); 
EasyRdf_Namespace::set('foaf', 'http://xmlns.com/foaf/0.1'); 
EasyRdf_Namespace::set('rdfs', 'http://www.w3.org/2000/01/rdf-schema#'); 




$sparql = new EasyRdf_Sparql_Client('http://dbpedia.org/sparql'); 
?> 

<html> 
<head> 
    <title>EasyRdf Basic Sparql Example</title> 
    <meta http-equiv="content-type" content="text/html; charset=utf-8" /> 
</head> 
<body> 
<h1>EasyRdf Basic Sparql Example</h1> 

<h2>List of artists</h2> 
<ul> 
<?php 
    $result = $sparql->query(
     'SELECT ?person ?name ?description WHERE {'. 
     ' ?person a dbo:MusicalArtist .'. 
     ' ?person dbo:birthPlace :Berlin .'. 
     ' ?person foaf:name ?name .'. 
     ' ?person rdfs:comment ?description . '. 
     ' FILTER (LANG(?description) = "en") .'. 
     '} ORDER BY ?name' 
    ); 
    foreach ($result as $row) { 
     echo "<li>".link_to($row->name, $row->person)."</li>\n"; 
    } 
?> 
</ul> 
<p>Total number of artists: <?= $result->numRows() ?></p> 

</body> 
</html> 

S'il vous plaît ... aidez-moi.

+0

Avez-vous défini le préfixe ':' quelque part dans votre requête? – AKSW

+0

À mon avis, la requête est bien. Cela fonctionne bien sur http://dbpedia.org/snorql et simplement, "bonjour monde", application de Jena. – Cezary

+0

Merci de votre suggestion. À mon avis, la requête est bien. Cela fonctionne bien sur http://dbpedia.org/snorql et simplement, "bonjour monde", application de Jena. Il s'agit d'une requête d'exemples sur ce site officiel: http://wiki.dbpedia.org/OnlineAccess#1 Querying DBpedia. Cependant, une autre application en ligne populaire - le vérificateur de requêtes SPARQL a quelques erreurs. Je travaille sur ça. J'ai une idée pour résoudre ce problème ennuyeux. – Cezary

Répondre

0

Lors du test par l'DBpedia SNORQL interface, plusieurs préfixes sont automatiquement prédéfinis, pour rendre plus facile curies -

PREFIX  owl: <http://www.w3.org/2002/07/owl#> 
PREFIX  xsd: <http://www.w3.org/2001/XMLSchema#> 
PREFIX  rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX  rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX  foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX  dc: <http://purl.org/dc/elements/1.1/> 
PREFIX   : <http://dbpedia.org/resource/> 
PREFIX dbpedia2: <http://dbpedia.org/property/> 
PREFIX dbpedia: <http://dbpedia.org/> 
PREFIX  skos: <http://www.w3.org/2004/02/skos/core#> 

La confusion peut venir lorsque vous essayez pour utiliser votre requête via un autre outil ou une autre interface, y compris, mais sans s'y limiter, EasyRDF, car la plupart n'auront pas de prédéfinitions pour tous ces préfixes - et certains peuvent avoir différentes extensions de la même chaîne de préfixe!

Vous devez vous assurer que votre requête inclut les mêmes définitions que SNORQL pour tous les préfixes que vous avez utilisés à partir de la liste de SNORQL.

Pour cette requête, il vous suffit de trois de la liste SNORQL (mais y compris les dix ne causera aucun problème), plus dbo: -

PREFIX  foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX   : <http://dbpedia.org/resource/> 
PREFIX  rdfs: <http://www.w3.org/2000/01/rdf-schema#> 

PREFIX  dbo: <http://dbpedia.org/ontology/> 

Les déclarations en EasyRDF regarder un peu différent, mais faire la même chose que ceux ci-dessus font dans SPARQL/SNORQL. Tout d'abord, le minimum nécessaire pour votre requête -

EasyRdf_Namespace::set('foaf', 'http://xmlns.com/foaf/0.1/'); 
EasyRdf_Namespace::set('', 'http://dbpedia.org/resource/'); 
EasyRdf_Namespace::set('rdfs', 'http://www.w3.org/2000/01/rdf-schema#'); 

EasyRdf_Namespace::set('dbo', 'http://dbpedia.org/ontology/'); 

- et, deuxièmement, l'ensemble dont vous avez besoin -

EasyRdf_Namespace::set('owl', 'http://www.w3.org/2002/07/owl#'); 
EasyRdf_Namespace::set('xsd', 'http://www.w3.org/2001/XMLSchema#'); 
EasyRdf_Namespace::set('rdfs', 'http://www.w3.org/2000/01/rdf-schema#'); 
EasyRdf_Namespace::set('rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'); 
EasyRdf_Namespace::set('foaf', 'http://xmlns.com/foaf/0.1/'); 
EasyRdf_Namespace::set('dc', 'http://purl.org/dc/elements/1.1/'); 
EasyRdf_Namespace::set('', 'http://dbpedia.org/resource/'); 
EasyRdf_Namespace::set('dbpedia2', 'http://dbpedia.org/property/'); 
EasyRdf_Namespace::set('dbpedia', 'http://dbpedia.org/'); 
EasyRdf_Namespace::set('skos', 'http://www.w3.org/2004/02/skos/core#'); 

EasyRdf_Namespace::set('dbo', 'http://dbpedia.org/ontology/'); 
+0

Merci monsieur. Ce sera vraiment utile. – Cezary

0

Ok. L'erreur est terminée. Quand pouvez-vous utiliser PHP avec EasyRDF pour interroger DBpedia, vous devez vous souvenir du préfixe de clé. C'est PREFIX : <http://dbpedia.org/resource/>. Vous pouvez utiliser cette requête simplement avec une seule déclaration - EasyRdf_Namespace::set('', 'http://dbpedia.org/resource/'). Mais une meilleure solution consiste à utiliser des PREFIX supplémentaires pour les tâches plus difficiles.

Avec EasyRDF, je propose ce code:

EasyRdf_Namespace::set('owl', 'http://www.w3.org/2002/07/owl#'); 
EasyRdf_Namespace::set('xsd', 'http://www.w3.org/2001/XMLSchema#'); 
EasyRdf_Namespace::set('rdfs', 'http://www.w3.org/2000/01/rdf-schema#'); 
EasyRdf_Namespace::set('rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'); 
EasyRdf_Namespace::set('foaf', 'http://xmlns.com/foaf/0.1/'); 
EasyRdf_Namespace::set('dc', 'http://purl.org/dc/elements/1.1/'); 
EasyRdf_Namespace::set('', 'http://dbpedia.org/resource/'); 
EasyRdf_Namespace::set('skos', 'http://www.w3.org/2004/02/skos/core#'); 
EasyRdf_Namespace::set('dbo', 'http://dbpedia.org/ontology/');