EasyRDF - SPARQL 查询 DBpedia - "Undefined namespace prefix" 错误
EasyRDF - SPARQL querying DBpedia - "Undefined namespace prefix" error
这是我的第一个问题。我正在制作一个简单的程序来查询 DBpedia。我用 PHP API + EasyRdf RDF Library for PHP.
SPARQL查询正确;它在 http://dbpedia.org/snorql 上运行良好。我可以使用 API 示例的查询;这也是正确的。我有 prefix
和 dbo
、foaf
、rdfs
...
但是当我在这个条件 ?person dbo:birthPlace :Berlin .
中使用这个查询时,我有这个错误:
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
我的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>
请...帮助我。
好的。错误结束。什么时候可以使用 PHP 和 EasyRDF 来查询 DBpedia,你应该记住键前缀。是PREFIX : <http://dbpedia.org/resource/>
。您可以使用仅包含一个声明的简单查询 - EasyRdf_Namespace::set('', 'http://dbpedia.org/resource/')
。但更好的解决方案是使用一些额外的 PREFIX
来完成更难的任务。
对于 EasyRDF,我建议使用以下代码:
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/');
当通过 DBpedia SNORQL interface 测试时,会自动预定义几个前缀,使 CURI 更容易 --
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#>
当您尝试通过其他工具或界面(包括但不限于 EasyRDF)使用查询时,可能会感到困惑,因为大多数不会对所有这些前缀进行预定义——有些可能 不同 相同前缀字符串的扩展!
对于您在 SNORQL 列表中使用的所有前缀,您必须确保查询包含与 SNORQL 相同 的定义。
对于此查询,您只需要 SNORQL 列表中的三个(但包括所有十个不会造成任何问题),加上 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/>
EasyRDF 中的声明看起来有点不同,但与上述 SPARQL/SNORQL 中的声明相同。首先,您的查询所需的最低限度 --
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/');
-- 其次,你需要的全套--
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/');
这是我的第一个问题。我正在制作一个简单的程序来查询 DBpedia。我用 PHP API + EasyRdf RDF Library for PHP.
SPARQL查询正确;它在 http://dbpedia.org/snorql 上运行良好。我可以使用 API 示例的查询;这也是正确的。我有 prefix
和 dbo
、foaf
、rdfs
...
但是当我在这个条件 ?person dbo:birthPlace :Berlin .
中使用这个查询时,我有这个错误:
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
我的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>
请...帮助我。
好的。错误结束。什么时候可以使用 PHP 和 EasyRDF 来查询 DBpedia,你应该记住键前缀。是PREFIX : <http://dbpedia.org/resource/>
。您可以使用仅包含一个声明的简单查询 - EasyRdf_Namespace::set('', 'http://dbpedia.org/resource/')
。但更好的解决方案是使用一些额外的 PREFIX
来完成更难的任务。
对于 EasyRDF,我建议使用以下代码:
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/');
当通过 DBpedia SNORQL interface 测试时,会自动预定义几个前缀,使 CURI 更容易 --
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#>
当您尝试通过其他工具或界面(包括但不限于 EasyRDF)使用查询时,可能会感到困惑,因为大多数不会对所有这些前缀进行预定义——有些可能 不同 相同前缀字符串的扩展!
对于您在 SNORQL 列表中使用的所有前缀,您必须确保查询包含与 SNORQL 相同 的定义。
对于此查询,您只需要 SNORQL 列表中的三个(但包括所有十个不会造成任何问题),加上 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/>
EasyRDF 中的声明看起来有点不同,但与上述 SPARQL/SNORQL 中的声明相同。首先,您的查询所需的最低限度 --
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/');
-- 其次,你需要的全套--
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/');