4

我想用 CONSTRUCT 替换我的 SPARQL 结果集中的一个属性,它基本上可以工作,除了前缀自动替换为“ns2”。有谁知道为什么,以及如何避免?

查询组长

" PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> " +
" PREFIX ma: <http://www.w3.org/ns/ma-ont#> " +
" PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> " +
" CONSTRUCT { ?subject ma:title ?label }  " +
 " WHERE { "+
 " ?subject rdfs:label ?label. " +

示例结果:

<http://dbpedia.org/resource/Japantown,_San_Francisco> ns2:title  "Japantown, San Francisco"@en 
4

1 回答 1

4

问题

对于它的价值,它看起来不像Jena正在这样做,而是(假设 DBpedia 资源的存在意味着您正在查询 DBpedia)DBpedia 的端点。鉴于这个简单的数据:

@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix ma: <http://www.w3.org/ns/ma-ont#> .

<http://dbpedia.org/resource/Japantown,_San_Francisco> rdfs:label  "Japantown, San Francisco"@en .

这个查询:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX ma: <http://www.w3.org/ns/ma-ont#>

CONSTRUCT { ?subject ma:title ?label }
WHERE { 
  ?subject rdfs:label ?label 
}

Jena 的 ARQ 似乎在 RDF/XML 和 TURTLE 中都保留了前缀:

$ arq --data data.n3 --query construct.sparql --results RDF/XML
<rdf:RDF
    xmlns:ma="http://www.w3.org/ns/ma-ont#"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  <rdf:Description rdf:about="http://dbpedia.org/resource/Japantown,_San_Francisco">
    <ma:title xml:lang="en">Japantown, San Francisco</ma:title>
  </rdf:Description>
</rdf:RDF>
$ arq --data data.n3 --query construct.sparql
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix ma:      <http://www.w3.org/ns/ma-ont#> .

<http://dbpedia.org/resource/Japantown,_San_Francisco>
      ma:title      "Japantown, San Francisco"@en .

但是,在DBpedia 公共 SPARQL 端点上运行一个非常相似的查询(注意 VALUES 将使我们的结果保持较小)会获得您提到的自动生成的命名空间前缀。

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX ma: <http://www.w3.org/ns/ma-ont#>

CONSTRUCT { ?subject ma:title ?label }
WHERE { 
  VALUES ?subject { <http://dbpedia.org/resource/Japantown,_San_Francisco> }
  ?subject rdfs:label ?label 
}

SPARQL 结果

@prefix ns0:    <http://www.w3.org/ns/ma-ont#> .
<http://dbpedia.org/resource/Japantown,_San_Francisco>  ns0:title   "Japantown, San Francisco"@en .

请注意,这些结果是相同的 RDF 图;前缀只是使某些输出更具可读性的一种方便方法。任何 RDF 处理工具都会看到它们是完全相同的图。Jena 没有做错任何事(事实上,Jena 的优点在于它保留了前缀),但在 DBpedia 上运行的 Virtuoso 实例也没有做错。

保留前缀

虽然前缀仅影响图形序列化的人类可读性,但图形序列化的人类可读性可能很重要。有一些方法可以保留前缀,即使 DBpedia 已经在您的领导下更改了它。

使用联合查询 (SERVICE)

在命令行上使用 ARQ(如上所示)和本地可用的数据在构建的模型中保留了所需的前缀。我们可以编写一个类似的查询来实际远程查询 DBpedia,但由于实际构建图形是 ARQ 的工作,因此前缀最终会以您期望的方式结束。例如:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX ma: <http://www.w3.org/ns/ma-ont#>

CONSTRUCT { ?subject ma:title ?label }
WHERE { 
  VALUES ?subject { <http://dbpedia.org/resource/Japantown,_San_Francisco> }
  SERVICE <http://dbpedia.org/sparql> {
    ?subject rdfs:label ?label 
  }
}

ARQ 仍然需要一个--data参数,所以我创建了一个空文件empty-data.n3. 这里我们想要的数据实际上来自 DBpedia。

$ arq --data empty-data.n3 --query construct-remote.sparql
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix ma:      <http://www.w3.org/ns/ma-ont#> .

<http://dbpedia.org/resource/Japantown,_San_Francisco>
      ma:title      "Japantown, San Francisco"@en .

更改 Jena 模型中的前缀 (PrefixMapping)

由于 Jena 模型是 PrefixMapping,因此您可以更改使用的前缀。这是运行远程查询(不使用联合查询)并随后更新前缀的 Java 代码。

import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.vocabulary.RDFS;

public class RemoteQueryPrefixChange {
    final static String MA_NS = "http://www.w3.org/ns/ma-ont#";

    final static String queryString = "" +
            "PREFIX rdfs: <"+RDFS.getURI()+">\n" +
            "PREFIX ma: <"+MA_NS+">\n" +
            "\n" +
            "CONSTRUCT { ?subject ma:title ?label }\n" +
            "WHERE {\n" +
            "  VALUES ?subject { <http://dbpedia.org/resource/Japantown,_San_Francisco> }\n" +
            "  ?subject rdfs:label ?label\n" +
            "}\n" +
            ""; 

    final static String DBPEDIA_SERVICE = "http://dbpedia.org/sparql";

    public static void main(String[] args) {
        Model results = QueryExecutionFactory.sparqlService( DBPEDIA_SERVICE, queryString ).execConstruct();
        System.out.println( "== Original Prefixes ==" );
        results.write( System.out, "TTL" );
        System.out.println( "== Updated Prefixes ==" );
        results.removeNsPrefix( results.getNsURIPrefix( MA_NS ));
        results.setNsPrefix( "ma", MA_NS);
        results.write( System.out, "TTL" );
    }
}

输出是(注意ns2模型的原始序列化和ma更新的序列化):

== Original Prefixes ==
@prefix ns2:     <http://www.w3.org/ns/ma-ont#> .
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

<http://dbpedia.org/resource/Japantown,_San_Francisco>
      ns2:title "Japantown, San Francisco"@en .
== Updated Prefixes ==
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix ma:      <http://www.w3.org/ns/ma-ont#> .
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

<http://dbpedia.org/resource/Japantown,_San_Francisco>
      ma:title "Japantown, San Francisco"@en .
于 2013-07-26T00:47:36.427 回答