SPARQL または Jena で、2 つのステートメント間の距離を計算することは可能ですか? たとえば、次の間の距離を計算することは可能ですか。
immanuel_kant dbprop:birthPlace Germany
John_Lock dbprop:birthPlace England
何を計算しようとしているのかを正確に伝えるのは難しいですが (私たちには伝えられていないため)、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
コメントの説明に基づいて、最初の類似度メトリックを計算するのはそれほど難しくありません。これは、個人が合計で持つクラスの数に対する共通のクラスの数として定義しました。これは、次のようなクエリで実行できます。
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
次のような結果が得られます。
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
最初のクエリのようなクエリを使用して哲学者の出身地をさらに選択し、類似度を計算するために使用している式を実行して類似度修飾子を取得するだけで、類似度の値を変更できます。