0

SPARQL または Jena で、2 つのステートメント間の距離を計算することは可能ですか? たとえば、次の間の距離を計算することは可能ですか。

immanuel_kant dbprop:birthPlace Germany
John_Lock     dbprop:birthPlace England
4

1 に答える 1

1

何を計算しようとしているのかを正確に伝えるのは難しいですが (私たちには伝えられていないため)、SPARQL でこれを行うことができるようです。次のクエリは、最初に哲学者のペアの類似性メトリックを計算し、それを にバインドし?initialSimilarityます。名前の長さの比率です。これは特に優れた類似度の尺度ではありませんが、これらのいくつかは既に定義されていると言っていました (コメントで言及されている .60)。次に、クエリは 2 人の哲学者の出身地を取得します。それらが同じである場合、.05 が類似度メトリックに追加されます。または、それらが異なる場合、.05 が減算され、この値が にバインドされ?finalSimilarityます。(個人は、birthPlace プロパティに対して複数の値を持つ場合があることに注意してください。n × m回、nは一方の出身地の数、mはもう一方の出身地の数です。ここでペアごとにグループ化し、最終的な類似性の平均を取るか、複​​数のステートメントを解決するために何かを行うことができます。たとえば、それぞれの代表的な出生地をサンプリングするなどです。)

select ?name1 ?name2 ?bp1 ?bp2 ?initialSimilarity ?finalSimilarity where { 
  dbpedia-owl:Philosopher ^a ?phil1, ?phil2 .
  ?phil1 rdfs:label ?name1 .
  ?phil2 rdfs:label ?name2 .
  filter( langMatches(lang(?name1),"en") && langMatches(lang(?name2),"en"))

  bind ( strlen(?name1) as ?len1 )
  bind ( strlen(?name2) as ?len2 )
  bind ( if(?len1 < ?len2, ?len1, ?len2) as ?minLen )
  bind ( if(?len1 < ?len2, ?len2, ?len1) as ?maxLen )
  bind ( ?minLen/xsd:double(?maxLen) as ?initialSimilarity )

  ?phil1 dbpedia-owl:birthPlace ?bp1 .
  ?phil2 dbpedia-owl:birthPlace ?bp2 .
  bind ( if( ?bp1 = ?bp2, ?initialSimilarity + .05, ?initialSimilarity - .05) as ?finalSimilarity )
}
limit 10

SPARQL の結果

コメントの説明に基づいて、最初の類似度メトリックを計算するのはそれほど難しくありません。これは、個人が合計で持つクラスの数に対する共通のクラスの数として定義しました。これは、次のようなクエリで実行できます。

select ?philosopher1
       ?philosopher2
       (count(distinct ?commonType) as ?intersection)
       (count(distinct ?eitherType) as ?union)
       (count(distinct ?commonType)/xsd:double(count(distinct ?eitherType)) as ?similarity)
where {
  dbpedia-owl:Philosopher ^a ?philosopher1, ?philosopher2 .
  filter( ?philosopher1 != ?philosopher2 )
  ?commonType ^a ?philosopher1, ?philosopher2 .
  { ?eitherType ^a ?philosopher1 } UNION
  { ?eitherType ^a ?philosopher2 } 
}
group by ?philosopher1 ?philosopher2 
limit 3

SPARQL の結果

次のような結果が得られます。

philosopher1                                  philosopher2                                    intersection  union similarity
http://dbpedia.org/resource/Bawa_Muhaiyaddeen http://dbpedia.org/resource/Abdolkarim_Soroush  6             34    0.176471
http://dbpedia.org/resource/Eric_Voegelin     http://dbpedia.org/resource/Abdolkarim_Soroush  6             30    0.2
http://dbpedia.org/resource/Eric_Ormsby       http://dbpedia.org/resource/%C3%89mile_Meyerson 18            24    0.75

最初のクエリのようなクエリを使用して哲学者の出身地をさらに選択し、類似度を計算するために使用している式を実行して類似度修飾子を取得するだけで、類似度の値を変更できます。

于 2013-10-08T15:35:41.490 に答える