データはRDFでdata.n3
として表すことができます :
@prefix : <http://example.org/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
:Network rdfs:subClassOf :Main .
:ATM rdfs:subClassOf :Network .
:ARPANET rdfs:subClassOf :Network .
:Software rdfs:subClassOf :Main .
:Linux rdfs:subClassOf :Software .
:Windows rdfs:subClassOf :Software .
:XP rdfs:subClassOf :Windows .
:Win7 rdfs:subClassOf :Windows .
:Win8 rdfs:subClassOf :Windows .
ここからは、rdfs:subClassOf
のパス(空のパスを含む)によって特定のクラスに接続されているすべてのものを検索するSPARQLクエリが必要です。 プロパティ。
prefix : <http://example.org/>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?superclass where {
:Win7 rdfs:subClassOf* ?superclass
}
--------------
| superclass |
==============
| :Win7 |
| :Windows |
| :Software |
| :Main |
--------------
そのクエリの結果は、必ずしもパス内の位置で並べ替えられているとは限りません(ただし、この場合は順番に並べられています)。それらを順番に必要とする場合は、これを行うことができます(これは、位置の計算に関するこの回答に基づいていますRDFリスト内の要素の数 ):
prefix : <http://example.org/>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?class where {
:Win7 rdfs:subClassOf* ?mid .
?mid rdfs:subClassOf* ?class .
}
group by ?class
order by count(?mid)
これにより、各祖先の?class
が検索されます。 :Win7
の 各?mid
と同様に 中間の祖先。祖先の場合?class
、距離は、(count(?mid)
間の中間関係の数として計算されます。 )。その距離に基づいて結果を並べ替えるので、:Win7
最も近い祖先である:Windows
その後など。
あなたはこのようにあなたが望むいくつかの凝ったフォーマットをすることさえできます:
prefix : <http://example.org/>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select (group_concat( ?name ; separator="--" ) as ?path) where {
{
select ?name where {
:Win7 rdfs:subClassOf* ?mid .
?mid rdfs:subClassOf* ?class .
bind( strAfter( str(?class), "http://example.org/") as ?name )
}
group by ?class ?name
order by count(?mid)
}
}
-----------------------------------
| path |
===================================
| "Win7--Windows--Software--Main" |
-----------------------------------
かもしれない より洗練された文字列処理を実行し、複数行の文字列を取得することが可能です。 この回答 の後半をご覧ください。 アイデアのためのうまく整列されたマトリックスのためのいくつかの凝ったフォーマットがあります。