Вашите данни могат да бъдат представени в 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 .
От тук вие просто искате SPARQL заявка, която намира всички неща, свързани с конкретен клас чрез път (включително празния път) на rdfs:subClassOf
свойства.
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" |
-----------------------------------
Може да бъде възможно да се направи по-изискана обработка на низове и да се получи многоредовият низ. Може да разгледате последната част на този отговор където има някакво изискано форматиране за добре подравнена матрица за идеи.