0

我正在尝试制作一个基本的 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() ; }

                         }

    }
4

2 回答 2

3

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

例如

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

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

于 2013-08-25T14:46:02.020 回答
3

正如KevinY 的回答所指出的,您需要定义您使用的命名空间。在公共 DBpedia SPARQL 端点上,为您预定义了许多命名空间,包括dbpedia-owl:dbpedia:。使用这些,您的查询应该类似于以下内容。(我添加了一个limit 50以减少人们单击链接对 DBpedia 造成的负担。)

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

SPARQL 结果

在对 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 发布的代码不同。请注意,在工作查询中,birthPlace前缀为dbpedia-owl:,即本体的命名空间,而Norway作为简单的 DBpedia 资源的前缀为dbpedia:。这意味着您查询中的 IRI 与工作查询中的 IRI 非常不同。我提出的工作查询产生了大量的结果。其实是一个修改版:

select count(?person) where {
  ?person dbpedia-owl:birthPlace dbpedia:Norway .
}

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

于 2013-08-26T15:32:35.473 回答