3

sparql で pyrdf を使用してタートル ファイルをフィルタリングしようとしています。しかし、sparql クエリは要素のコンテキストで情報を失うことに気付きました。クエリの結果をタートル ファイルとして再印刷したいのですが、要素のすべてのサブフィールドを手動でスキャンせずにこれを行うことは可能ですか? 次のようにフォーマットされた場所に関するデータがあります。

:pt0001
     vcard:category "Poste e Telegrafi"
    ; vcard:fn "Ufficio Bologna 1"
    ; vcard:extended-address "Via Cairoli 9, Bologna BO, Italy"
    ; vcard:latitude "44.504192"
    ; vcard:longitude "11.338661"
    ; vcard:tel "051 243425"
    ; vcard:fax "051 244459"
    ; cs:opening "Mon, Tue, Wed, Thu, Fri: 0800-1330. Sat: 0800-1230."
    ; cs:closing "01-01, 01-06, P, LA, 04-25, 05-01, 06-02, 08-15, 11-01, 12-08, 12-25, 12-26: .".

たとえば、名前 (fn) を持つ場所のみが必要です。あなたが見つけたヒントをありがとう...

4

1 に答える 1

4

名前を持つすべての場所を取得するには、次のような簡単なことを行うことができます:

SELECT DISTINCT ?location
WHERE { 
   ?location vcard:fn [].
}

これにより、識別子が返さ:pt0001れます(例では)が、もちろん、すべてのプロパティ値を返すようにクエリを調整することもできます。

編集あなたの説明に基づいて追加の例を追加しました。これがあなたが求めているものだと思います)

そのようです:

SELECT ?location ?prop ?value
WHERE { 
   ?location vcard:fn [];
             ?prop ?value .
} ORDER BY ?location

このクエリの結果は、次の形式の結果のテーブルになります。

?location    ?prop           ?value
:pt0001      vcard:category  "Poste e Telegrafi"
:pt0001      vcard:name      "Ufficio Bologna 1"
:pt0001      vcard:tel       "051 243425"
(etc...)   

または、さらに別の方法として、クエリを明示的に定式化して、各場所の特定のプロパティ値を取得することもできます。

SELECT ?location ?name ?cat ?tel
WHERE { 
   ?location vcard:fn ?name ;
             vcard:category ?cat ;
             vcard:tel ?tel .
} ORDER BY ?location

次の形式の結果テーブルが返されます。

?location ?name               ?cat                ?tel
:pt0001   "Ufficio Bologna 1" "Poste e Telegrafi" "051 243425"

好きなのを選びな。

SPARQL クエリの秘訣は、トリプルの観点から考えることです。データには主語-述語-目的語のトリプルが含まれており、SPARQL クエリはこれらのトリプルに対してパターンを定式化します。

さらなる注意として、クエリの結果をタートルとして再印刷することを考えているようです。その場合、CONSTRUCT クエリが必要になる可能性があります。SELECT クエリの結果 (上記のように) はテーブル構造ですが、CONSTRUCT クエリの結果は RDF トリプルのコレクションです。

 CONSTRUCT { ?subject ?predicate ?object }
 WHERE { 
   ?subject ?predicate ?object ;
            vcard:fn [] 
 }
于 2012-04-18T18:50:20.530 に答える