【问题标题】:get latitude and longitude of a place dbpedia获取一个地方的纬度和经度 dbpedia
【发布时间】:2013-05-24 14:42:11
【问题描述】:

我想得到一个我已经知道名字的地方的纬度和经度

PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT * WHERE {
  ?s a dbo:Place .
  ?s geo:lat ?lat .
  ?s geo:long ?long .
} 

地点名称 (?s) 类似于 Graves Park。 如果地方名称可能有所不同,如何在耶拿实施同样的方法?

【问题讨论】:

  • PREFIX geo:w3.org/2003/01/geo/wgs84_pos#> PREFIX asd:dbpedia.org/page> SELECT ?lati ?longi WHERE { asd:Graves_Park geo:long ?lati. asd:Graves_Park 地理:纬度 ?longi。 } 得到一个空结果
  • “DBpedia 数据集”的 Section 3. Denoting or Naming “things” 表示“DBpedia 数据集中的每个事物都由 dbpedia.org/resource/Name 形式的可取消引用的 IRI 或基于 URI 的引用表示,其中名称源自维基百科源文章的 URL。”如果您取消引用,例如 dbpedia.org/resource/Mount_Monadnock ,您将被重定向到 dbpedia.org/page/Mount_Monadnockresource 是实际的东西,page 只是一个包含有关它的信息的页面。如果你滚动到底部……
  • ... 在页面中,您将看到“CSV 中的原始数据 | RDF (…) | OData (…) |微数据 (…) | JSON-LD”。如果您选择其中一种 RDF 格式,例如 N-Triples,您会看到所有数据仍然是关于 resource,而不是页面。这有点像传记如何包含关于一个人的大量信息;传记中的信息(page)不是关于传记(page),而是关于人(resource)。
  • 非常感谢。是的,这让事情变得更清楚了。

标签: sparql jena dbpedia


【解决方案1】:

您可以使用 Jena 的 ARQ 对远程 SPARQL 端点执行查询。该过程在ARQ — Querying Remote SPARQL Services 中进行了描述。

在 SELECT 查询中使用 ParameterizedSparqlStrings

要对在执行查询之前可能不知道的不同位置执行此操作,您可以使用ParameterizedSparqlString 来保存查询,然后在获得值后注入值。这是一个例子。查询是您提供的查询。我把它放到一个ParameterizedSparqlString中,然后用setIri?s设置为http://dbpedia.org/resource/Mount_Monadnock

import com.hp.hpl.jena.query.ParameterizedSparqlString;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.query.ResultSetFormatter;

public class DBPediaQuery {
    public static void main( String[] args ) {
        final String dbpedia = "http://dbpedia.org/sparql";
        final ParameterizedSparqlString queryString
          = new ParameterizedSparqlString(
                    "PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>"+
                    "PREFIX dbo: <http://dbpedia.org/ontology/>" +
                    "SELECT * WHERE {" +
                    "  ?s a dbo:Place ." +
                    "  ?s geo:lat ?lat ." +
                    "  ?s geo:long ?long ." +
                    "}" );
        queryString.setIri( "?s", "http://dbpedia.org/resource/Mount_Monadnock");
        QueryExecution exec = QueryExecutionFactory.sparqlService( dbpedia, queryString.toString() );
        ResultSet results = exec.execSelect();
        ResultSetFormatter.out( System.out, results );
    }
}

由此打印出来的结果是:

--------------------------------------------------------------------------------------------------------------
| lat                                                 | long                                                 |
==============================================================================================================
| "42.8608"^^<http://www.w3.org/2001/XMLSchema#float> | "-72.1081"^^<http://www.w3.org/2001/XMLSchema#float> |
--------------------------------------------------------------------------------------------------------------

获得ResultSet 后,您可以遍历解决方案的行并提取值。这里的值是Literals,您可以从Literal 中提取词法形式(字符串值),或作为相应Java 类型的值(对于数字、字符串、布尔值等)。您可以执行以下操作来打印纬度和经度,而不是使用ResultSetFormatter

while ( results.hasNext() ) {
  QuerySolution solution = results.next();
  Literal latitude = solution.getLiteral( "?lat" );
  Literal longitude = solution.getLiteral( "?long" );

  String sLat = latitude.getLexicalForm();
  String sLon = longitude.getLexicalForm();

  float fLat = latitude.getFloat();
  float fLon = longitude.getFloat();

  System.out.println( "Strings: " + sLat + "," + sLon );
  System.out.println( "Floats: " + fLat + "," + fLon );
}

修改后的输出为:

Strings: 42.8608,-72.1081
Floats: 42.8608,-72.1081

在 CONSTRUCT 查询中使用 ParameterizedSparqlStrings

基于某些 cmets,使用 CONSTRUCT 查询来保存每个查询的结果并将它们聚合到更大的模型中也可能很有用。下面的代码使用构造查询来检索蒙纳德诺克山和拉斐特山的纬度和经度,并将它们存储在单个模型中。 (这里我们只是使用CONSTRUCT WHERE {…},所以返回的模型和匹配的图部分完全一样。使用CONSTRUCT {…} WHERE {…}可以得到不同的结果。)

import com.hp.hpl.jena.query.ParameterizedSparqlString;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;

public class DBPediaQuery {
  public static void main( String[] args ) {
    final String dbpedia = "http://dbpedia.org/sparql";
    final ParameterizedSparqlString queryString
      = new ParameterizedSparqlString(
            "PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>"+
            "PREFIX dbo: <http://dbpedia.org/ontology/>" +
            "CONSTRUCT WHERE {" +
            "  ?s a dbo:Place ." +
            "  ?s geo:lat ?lat ." +
            "  ?s geo:long ?long ." +
            "}" );
    Model allResults = ModelFactory.createDefaultModel();
    for ( String mountain : new String[] { "Mount_Monadnock", "Mount_Lafayette" } ) {
      queryString.setIri( "?s", "http://dbpedia.org/resource/" + mountain );
      QueryExecution exec = QueryExecutionFactory.sparqlService( dbpedia, queryString.toString() );
      Model results = exec.execConstruct();
      allResults.add( results );
    }
    allResults.setNsPrefix( "geo", "http://www.w3.org/2003/01/geo/wgs84_pos#" );
    allResults.setNsPrefix( "dbo", "http://dbpedia.org/ontology/" );
    allResults.setNsPrefix( "dbr", "http://dbpedia.org/resource/" );
    allResults.write( System.out, "N3" );
  }
}

输出显示两个查询的三元组:

@prefix dbr:     <http://dbpedia.org/resource/> .
@prefix geo:     <http://www.w3.org/2003/01/geo/wgs84_pos#> .
@prefix dbo:     <http://dbpedia.org/ontology/> .

dbr:Mount_Lafayette
      a       dbo:Place ;
      geo:lat "44.1607"^^<http://www.w3.org/2001/XMLSchema#float> ;
      geo:long "-71.6444"^^<http://www.w3.org/2001/XMLSchema#float> .

dbr:Mount_Monadnock
      a       dbo:Place ;
      geo:lat "42.8608"^^<http://www.w3.org/2001/XMLSchema#float> ;
      geo:long "-72.1081"^^<http://www.w3.org/2001/XMLSchema#float> .

【讨论】:

  • 将它存储在 rdf 三元存储中的合适方法是什么?我正在寻找建立三重商店的方法,但无法理解它。我读到结果集将仅具有一次迭代的值,之后它将丢失。
  • 如何将上述查询中检索到的纬度存储到字符串中?
  • @Kriss 至于第二条评论:我已经用一个迭代结果集中的解决方案的示例更新了答案。
  • @Kriss:至于第一条评论:如果您想保存正在检索的数据,您可以使用CONSTRUCT 查询而不是SELECT 查询,然后添加结果绘制到局部模型。如果这听起来像是一个合适的选择,我可以更新答案。
  • 我用一个例子更新了一个 CONSTRUCT 查询,它的结果被聚合到一个模型中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 2016-09-29
  • 1970-01-01
相关资源
最近更新 更多