1

私は Linked-Data にかなりSPARQL慣れていませんが、SQL の知識があるので、概念とクエリの一部を理解しています。rdfdata.org のサンプル データを使用して、 Elvis impersonator repoを使用して GraphDB インスタンスをセットアップすることができました。

オブジェクト値のフィルタリングなどのいくつかの基本的なクエリを使用して、いくつ SELECT * WHERE {?s ?p ?o}かの基本的なデータをテーブルに表示することができました。私は正規表現を使用した経験があるので、これを SPARQL で使用してElvis、オブジェクト内の出現をカウントすることにしました。しかし、私が何をしても、これを上記のものにすることはできません。

elvis複数のフォームを含むトリプルがあるため、これは問題です。

 s: http://www.gigmasters.com/elvis/bobjames/
 p: ep:influences
 o: Elvis Elvis Elvis! I also do a Neil Diamond tribute as well, and have 
     been a DJ, MC, and musician for many years.

ご覧のとおりElvis、1 としてカウントされる 3 つのオカレンスがあります。

トリプルを選択し、出現回数をカウントするために使用される SPARQL クエリを次に示します。

SELECT ?s ?p ?o (count(regex( ?o ,"[Ee]lvis")) as ?count)
WHERE {
    ?s ?p ?o.
    filter(regex( ?o ,"([Ee]lvis.){3}")) //only return the triple above
}
GROUP BY ?s ?p ?o

これらの発生がカウントされない可能性はありますか? 私は使用してみstr(?o)ましたが、オブジェクトは文字列リテラルであるため、それは問題ではありません。

期待される結果:

le table with 4 columns: | ?s | ?p | ?o | count |, ここで count は"3"^^xsd:integer

4

2 に答える 2

4

これを行うには、入力文字列 (例: ) を取得し、ターゲット (例: ) を空の文字列 ( )"A B A C"に置き換えて、更新された文字列 (例: ) を取得します。次に、更新された文字列の長さと入力文字列の長さの差を計算します。それをターゲットの長さで割ると、それがターゲットが入力に表示される回数になります。例えば:"A"""" B C"

@prefix : <urn:ex:>

:a :hasString "I like Elvis." .
:b :hasString "Elvis's name was Elvis." .
:c :hasString "Not mentioned here" .
:d :hasString "daybydaybyday" .
prefix : <urn:ex:>

select ?x ?s ?t ?count where {
  values ?t { "Elvis" "daybyday" }
  ?x :hasString ?s .
  bind(((strlen(?s) - strlen(replace(?s, ?t, ""))) / strlen(?t)) as ?count)
}
-------------------------------------------------------
| x  | s                         | t          | count |
=======================================================
| :a | "I like Elvis."           | "Elvis"    | 1.0   |
| :b | "Elvis's name was Elvis." | "Elvis"    | 2.0   |
| :c | "Not mentioned here"      | "Elvis"    | 0.0   |
| :d | "daybydaybyday"           | "Elvis"    | 0.0   |
| :a | "I like Elvis."           | "daybyday" | 0.0   |
| :b | "Elvis's name was Elvis." | "daybyday" | 0.0   |
| :c | "Not mentioned here"      | "daybyday" | 0.0   |
| :d | "daybydaybyday"           | "daybyday" | 1.0   |
-------------------------------------------------------

ここでいくつかの注意事項があります。

  • ターゲット文字列は「通常の」文字列でなければなりません。たとえば、さまざまな長さのテキストに展開できる本物の正規表現パターンの場合、この方法は機能しません。
  • これが重複する文字列をどのように処理するかを認識する必要があります。たとえば、入力テキストが「daybydaybyday」で、ターゲットが「daybyday」の場合、1回または2 回カウントすることを期待していますか? このメソッドを使用すると、 が1 つだけ取得されます。これは、1 つのオカレンスが置換されると、残りの文字列がそれ以上存在しないためです。
于 2017-07-24T12:20:52.527 に答える