查询挪威出生的人会导致未定义的名称空间前缀

时间:2013-08-25 12:14:01

标签: java sparql jena dbpedia

我正在尝试创建一个基本的DBpedia应用程序(仅用于测试)。当我使用此查询时:

SELECT ?person WHERE {
  ?person dbo:birthPlace:Norway ?person
}

我收到以下消息:

  

SPARQL编译器,第6行:''之前'}'

中的未定义名称空间前缀

有人可能会告诉我我做错了什么吗?它适用于DBpedia查询测试程序。

编辑:来自Pastebin的Java代码

package jena_test;

import java.io.Writer;
import java.sql.ResultSet;

import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;

public class Dbpedia {

    String test = "123"; 
    static String sparqlQueryString="PREFIX dbo:<http://dbpedia.org/ontology/> "
            + "SELECT ?person "
            + "WHERE { ?person dbo:birthPlace dbo:Norway } ";
    public static void main(String[] args) {
        // TODO Auto-generated method stub





        Model model = ModelFactory.createDefaultModel();
                         Query query = QueryFactory.create(sparqlQueryString);

                         QueryExecution qexec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", sparqlQueryString);


                         try {
                             com.hp.hpl.jena.query.ResultSet results = qexec.execSelect();
                             for ( ; results.hasNext() ; )
                         {
                             QuerySolution soln = results.nextSolution() ;
                             String x = soln.get("Concept").toString();

                             System.out.print(x +"\n");


                         }

                         }

                         finally { qexec.close() ; }

                         }

    }

2 个答案:

答案 0 :(得分:3)

我无法让你的例子在dbpedia上工作,并假设你打算在某处定义dbo命名空间,因为它抱怨不知道dbo是什么。

例如

PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbpedia: <http://dbpedia.org/resource/>
SELECT ?person WHERE { ?person dbo:birthPlace dbpedia:Norway }

哪个有效。但它会回归你想要的吗?

答案 1 :(得分:3)

正如KevinY's answer指出的那样,您需要定义您使用的命名空间。在the public DBpedia SPARQL endpoint上,为您预定义了许多名称空间,包括dbpedia-owl:dbpedia:。使用这些,您的查询应该类似于以下内容。 (我添加了limit 50,以减少用户点击链接对DBpedia施加的负担。)

select ?person where {
  ?person dbpedia-owl:birthPlace dbpedia:Norway .
}
limit 50

SPARQL results

在对KevinY的回答的评论中,您链接了一些pastebin代码(但实际上,所有相关代码都应包含在问题中;请更新您的问题!),其中查询定义为

   static String sparqlQueryString="PREFIX dbo:<http://dbpedia.org/ontology/> "
                    + "SELECT ?person "
                    + "WHERE { ?person dbo:birthPlace dbo:Norway } ";

,在一些字符串连接之后,是:

PREFIX dbo:<http://dbpedia.org/ontology/> 
SELECT ?person 
WHERE { ?person dbo:birthPlace dbo:Norway }

与KevinY发布的代码相同。请注意,在工作查询中,birthPlacedbpedia-owl:为前缀,即本体的命名空间,而Norway是一个简单的DBpedia资源,以{{1}为前缀}。这意味着查询中的IRI与工作查询中的IRI非常不同。我提出的工作查询产生了很多结果。实际上,修改后的版本:

dbpedia:

表示DBpedia包含1694名出生于挪威的已知人员。