SPARQL 查询 returns 空
SPARQL query returns null
基于使用 SPARQL 和 DBPedia,我想检索有关位于巴黎的所有教堂的信息。
如果我 运行 下面的代码,它 returns null
。我不知道哪里出了问题,因为没有错误信息。
package com.tests.example;
import org.apache.jena.query.Query;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.QueryExecutionFactory;
import org.apache.jena.query.QueryFactory;
import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.rdf.model.RDFNode;
public class JenaTestDBPedia {
public static void main(String[] args) {
String queryString=
"PREFIX p: <http://dbpedia.org/property/>" +
"PREFIX dbpedia: <http://dbpedia.org/resource/>" +
"PREFIX category: <http://dbpedia.org/resource/Category:>" +
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>" +
"PREFIX skos: <http://www.w3.org/2004/02/skos/core#>" +
"PREFIX geo: <http://www.georss.org/georss/>" +
"SELECT DISTINCT ?m ?n ?p ?d" +
"WHERE {" +
" ?m rdfs:label ?n." +
" ?m skos:subject ?c." +
" ?c skos:broader category:Churches_in_Paris." +
" ?m p:abstract ?d." +
" ?m geo:point ?p" +
" }";
Query query = QueryFactory.create(queryString);
QueryExecution qexec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", query);
try {
ResultSet results = qexec.execSelect();
while(results.hasNext()) {
QuerySolution qs = results.next();
RDFNode type = qs.get("label");
System.out.println(type.toString());
}
}
finally {
qexec.close();
}
}
}
更新:
更正查询(尽管它不起作用):
"SELECT DISTINCT ?m ?n ?p ?d \n" +
"WHERE { \n" +
" ?m rdfs:label ?n." +
" ?m skos:subject ?c." +
" ?c skos:broader category:Churches_in_Paris." +
" ?m p:abstract ?d." +
" ?m geo:point ?p" +
" }";
qs.get("label");
您没有 select 一个名为 label 的变量。对于 rdfs:label 的值,您使用了 属性 ?n
。您需要使用 qs.get("n")
.
此外,请注意您的字符串连接有一些意想不到的效果,例如 "select ... ?dWHERE { ...",并且您的查询没有使用名为 dWHERE 的变量。
我将专注于查询,而不是其余代码:
- 没有
skos:subject
,需要dct:subject
- 而不是
p:abstract
,您需要 dbo:abstract
更正后的查询:
PREFIX category: <http://dbpedia.org/resource/Category:>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX geo: <http://www.georss.org/georss/>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT DISTINCT ?m ?n ?p ?d WHERE {
?m rdfs:label ?n.
?m dct:subject ?c.
?c skos:broader category:Churches_in_Paris.
?m dbo:abstract ?d.
?m geo:point ?p
}
其他几点:
- 考虑将摘要和标签过滤为您感兴趣的语言(可能是英语)
- 考虑制作
geo:point
OPTIONAL
,因为并非所有结果都有
- 考虑父类别的子类别,而不仅仅是子类别
- 考虑使用比看似随机的单个字母更具描述性的变量名
基于使用 SPARQL 和 DBPedia,我想检索有关位于巴黎的所有教堂的信息。
如果我 运行 下面的代码,它 returns null
。我不知道哪里出了问题,因为没有错误信息。
package com.tests.example;
import org.apache.jena.query.Query;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.QueryExecutionFactory;
import org.apache.jena.query.QueryFactory;
import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.rdf.model.RDFNode;
public class JenaTestDBPedia {
public static void main(String[] args) {
String queryString=
"PREFIX p: <http://dbpedia.org/property/>" +
"PREFIX dbpedia: <http://dbpedia.org/resource/>" +
"PREFIX category: <http://dbpedia.org/resource/Category:>" +
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>" +
"PREFIX skos: <http://www.w3.org/2004/02/skos/core#>" +
"PREFIX geo: <http://www.georss.org/georss/>" +
"SELECT DISTINCT ?m ?n ?p ?d" +
"WHERE {" +
" ?m rdfs:label ?n." +
" ?m skos:subject ?c." +
" ?c skos:broader category:Churches_in_Paris." +
" ?m p:abstract ?d." +
" ?m geo:point ?p" +
" }";
Query query = QueryFactory.create(queryString);
QueryExecution qexec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", query);
try {
ResultSet results = qexec.execSelect();
while(results.hasNext()) {
QuerySolution qs = results.next();
RDFNode type = qs.get("label");
System.out.println(type.toString());
}
}
finally {
qexec.close();
}
}
}
更新: 更正查询(尽管它不起作用):
"SELECT DISTINCT ?m ?n ?p ?d \n" +
"WHERE { \n" +
" ?m rdfs:label ?n." +
" ?m skos:subject ?c." +
" ?c skos:broader category:Churches_in_Paris." +
" ?m p:abstract ?d." +
" ?m geo:point ?p" +
" }";
qs.get("label");
您没有 select 一个名为 label 的变量。对于 rdfs:label 的值,您使用了 属性 ?n
。您需要使用 qs.get("n")
.
此外,请注意您的字符串连接有一些意想不到的效果,例如 "select ... ?dWHERE { ...",并且您的查询没有使用名为 dWHERE 的变量。
我将专注于查询,而不是其余代码:
- 没有
skos:subject
,需要dct:subject
- 而不是
p:abstract
,您需要dbo:abstract
更正后的查询:
PREFIX category: <http://dbpedia.org/resource/Category:>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX geo: <http://www.georss.org/georss/>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT DISTINCT ?m ?n ?p ?d WHERE {
?m rdfs:label ?n.
?m dct:subject ?c.
?c skos:broader category:Churches_in_Paris.
?m dbo:abstract ?d.
?m geo:point ?p
}
其他几点:
- 考虑将摘要和标签过滤为您感兴趣的语言(可能是英语)
- 考虑制作
geo:point
OPTIONAL
,因为并非所有结果都有 - 考虑父类别的子类别,而不仅仅是子类别
- 考虑使用比看似随机的单个字母更具描述性的变量名