1

次の SPARQL で geonames からリンクされたデータを取得しようとしていますが、明らかに間違っています。

prefix oxprop: <http://ophileon.com/ox/property#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl:  <http://www.w3.org/2002/07/owl#>
prefix wgs84_pos: <http://www.w3.org/2003/01/geo/wgs84_pos#>

select ?poi ?poiname ?geonames ?latitude


from  <http://www.ophileon.com/ox/poi.rdf>
# from  <http://sws.geonames.org/ >

where
{

   ?poi rdfs:label ?poiname.
   ?poi owl:sameAs ?geonames.
#   ?geonames wgs84_pos:lat ?latitude.


  FILTER(langMatches(lang(?poiname), "EN")).

}

これは、sparql.org の JSON 出力を使用して:

{
  "head": {
    "vars": [ "poi" , "poiname" , "geonames" , "latitude" ]
  } ,
  "results": {
    "bindings": [
      {
        "poi": { "type": "uri" , "value": "http://ophileon.com/ox/poi/2" } ,
        "poiname": { "type": "literal" , "xml:lang": "en" , "value": "Wageningen" } ,
        "geonames": { "type": "uri" , "value": "http://sws.geonames.org/2745088" }
      } ,
      {
        "poi": { "type": "uri" , "value": "http://ophileon.com/ox/poi/3" } ,
        "poiname": { "type": "literal" , "xml:lang": "en" , "value": "Netherlands" } ,
        "geonames": { "type": "uri" , "value": "http://sws.geonames.org/2750405" }
      } ,
      {
        "poi": { "type": "uri" , "value": "http://ophileon.com/ox/poi/1" } ,
        "poiname": { "type": "literal" , "xml:lang": "en" , "value": "Amsterdam" } ,
        "geonames": { "type": "uri" , "value": "http://sws.geonames.org/2759794" }
      }
    ]
  }
}

私が達成したいのは、「http://sws.geonames.org/2745088/about.rdf」のようなアドレスを持つ geonames rdf サービスを使用して、各ノードの緯度を取得することです。

「#」で始まる行は、私が間違っていると思われる行です..

次の反復

geonamesID の後ろに「/」を追加し、これを実行した後:

prefix oxprop: <http://ophileon.com/ox/property#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl:  <http://www.w3.org/2002/07/owl#>
prefix wgs84_pos: <http://www.w3.org/2003/01/geo/wgs84_pos#>

select *

from <http://www.ophileon.com/ox/poi.rdf>
from <http://sws.geonames.org/2745088/about.rdf>    
from <http://sws.geonames.org/2750405/about.rdf>    
from <http://sws.geonames.org/2759794/about.rdf>
where
{
   ?poi rdfs:label ?poiname.
   ?poi owl:sameAs ?geonames.
   ?geonames wgs84_pos:lat ?latitude.
   FILTER(langMatches(lang(?poiname), "EN")).
}

これを返します:

-------------------------------------------------------------------------------------------------------
| poi                            | poiname          | geonames                           | latitude   |
=======================================================================================================
| <http://ophileon.com/ox/poi/2> | "Wageningen"@en  | <http://sws.geonames.org/2745088/> | "51.97"    |
| <http://ophileon.com/ox/poi/3> | "Netherlands"@en | <http://sws.geonames.org/2750405/> | "52.5"     |
| <http://ophileon.com/ox/poi/1> | "Amsterdam"@en   | <http://sws.geonames.org/2759794/> | "52.37403" |
-------------------------------------------------------------------------------------------------------

次の反復: "SERVICE" キーワードを使用

prefix oxprop: <http://ophileon.com/ox/property#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl:  <http://www.w3.org/2002/07/owl#>
prefix wgs84_pos: <http://www.w3.org/2003/01/geo/wgs84_pos#>


select ?poi ?poiname ?geonameuri ?latitude

from <http://www.ophileon.com/ox/poi.rdf>

where
{
   ?poi rdfs:label ?poiname.
   ?poi owl:sameAs ?geonameuri.
   SERVICE <http://factforge.net/sparql>{
   ?geonameuri wgs84_pos:lat ?latitude.
   }
   FILTER(langMatches(lang(?poiname), "EN")).
}

これにより、factforge がさまざまなデータ型で複数の値を返すことを除いて、私が望んでいた結果が得られました。
このリソースhttp://wifo5-03.informatik.uni-mannheim.de/latc/www2012/Session%201.htmlは非常に役立つことがわかりました。

4

1 に答える 1

7

タイプミスとデータを取得できない

ここには2つの問題があると思います。最初は軽微なタイプミスです。コメント行のコメントを外してクエリを実行すると、行が原因で解析エラーが発生します

from  <http://sws.geonames.org/ >

IRI にスペースがあってはならないからです。それは簡単に修正できます。修正されると、sparql.org のサービスは次のように応答します。

Error 400: Failed to load URL (parse error) http://sws.geonames.org/ : Failed to determine the triples content type: (URI=http://sws.geonames.org/ : stream=null : hint=null)

Fuseki - version 1.0.0 (Build date: 2013-09-12T10:49:49+0100)

これは、Jena がその IRI の内容を引き出すことはできたが、それを RDF として読み取る方法を理解できなかったことを意味すると私は信じています。Google で簡単に検索すると、その IRI が名前空間プレフィックスとして使用されているクエリが多数表示されますが、トリプルを選択できるグラフとして IRI が使用されている場所は見当たりません。これは geonames.org がそのドキュメントで述べていることと一致すると思います:

GeoNames セマンティック Web へのエントリ ポイント

GeoNames Semantic Web に入る方法はいくつかあります。

  • 母なる地球から始めて、Linked Data のリンクをたどってください。
  • type=rdfパラメーター オプションを指定してgeonames 検索 Web サービスを使用します。
  • データベース ダンプをダウンロードし、パターン「http://sws.geonames.org/geonameId/」を使用してフィーチャの URL を作成します。
  • 8514201 個の機能と約 1 億 2500 万の rdf トリプルを含むRDF ダンプ(2013 08 27)。ダンプには、ファイルの各行の地名ごとに 1 つの rdf ドキュメントがあります。注: ファイルはかなり大きいです。圧縮解除に使用するツールがサイズを処理でき、2 GB の後に停止しないことを確認してください。これは、一部の古い (Windows) ツール バージョンで発生する問題です。

そのリストに SPARQL エンドポイントが表示されないことに少し驚いていますが、もしあれば、このオプションのリストに含まれていると思います。

クエリを変更してデータを取得する

これで、成功したクエリ (コメント行なし) は次の結果を返します。

poi                            poiname          geonames                          latitude
<http://ophileon.com/ox/poi/2> "Wageningen"@en  <http://sws.geonames.org/2745088>   
<http://ophileon.com/ox/poi/3> "Netherlands"@en <http://sws.geonames.org/2750405>   
<http://ophileon.com/ox/poi/1> "Amsterdam"@en   <http://sws.geonames.org/2759794>

注:これらは、この回答を書き始めた時点の結果です。ただし、これは のデータに基づいているため、http://www.ophileon.com/ox/poi.rdf変更されている可能性があります。このクエリを後で実行するとgeonames、 final を持つ の/値が取得されますhttp://sws.geonames.org/2745088/

同じドキュメントに基づいており、次のことも述べています。

フランスの Embrun という町には、次の 2 つの URI があります。

  1. http://sws.geonames.org/3020251/
  2. http://sws.geonames.org/3020251/about.rdf

最初の URI [1] は、フランスの町を表します。町を参照する場合は、この URI を使用します。2 番目の URI [2] は、geonames が Embrun について持っている情報を含むドキュメントです。

これは、グラフ名としても使用される特定のジオネーム IRI を使用したクエリが機能する可能性があることを示唆しています。つまり、次のようなクエリが機能する可能性があります。

prefix oxprop: <http://ophileon.com/ox/property#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl:  <http://www.w3.org/2002/07/owl#>
prefix wgs84_pos: <http://www.w3.org/2003/01/geo/wgs84_pos#>

select ?poi ?poiname ?geonames ?latitude
from <http://www.ophileon.com/ox/poi.rdf>
from <http://sws.geonames.org/2745088/about.rdf>    
from <http://sws.geonames.org/2750405/about.rdf>    
from <http://sws.geonames.org/2759794/about.rdf>
where
{
   ?poi rdfs:label ?poiname.
   ?poi owl:sameAs ?geonames.
   ?geonames wgs84_pos:lat ?latitude.
   FILTER(langMatches(lang(?poiname), "EN")).
}

これでも結果は返されませんが、すべてのデータがそこにあるはずです。もっと簡単なクエリを試してみましょう。次のようなクエリを使用する場合:

select * 
from <http://sws.geonames.org/2759794/about.rdf>
where { ?s ?p ?o }

SPARQL の結果

あなたはその場所についてたくさんのトリプルを得るでしょう. これは、複数のfrom句でも機能します。たとえば、そのデータと自分のデータを次のクエリで使用すると、結合された結果が得られます。

select * 
from <http://www.ophileon.com/ox/poi.rdf>
from <http://sws.geonames.org/2745088/about.rdf>  
where { ?s ?p ?o }

SPARQL の結果

そのデータセットの結果を見ると、最終的にどこに問題があるかがわかります。geonames リソースの IRI は/実際の形式では終わりますが、データには含まれていません/。それに応じてデータを変更する必要があります。

注: のデータhttp://www.ophileon.com/ox/poi.rdfはその後修正されたようです。

ジオネームから取得したいデータを決定するために最初のクエリを実行し、その情報を取得してから、それに対して 2 番目のクエリを実行する必要があるようです。あるいは、Geonames が提供するビッグ データ ダンプをダウンロードしてローカルで使用することもできます (おそらく最も簡単な解決策です)。

于 2013-10-16T11:01:22.300 に答える