Twoje dane mogą być reprezentowane w RDF jako 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 .
Stąd potrzebujesz tylko zapytania SPARQL, które znajdzie wszystkie rzeczy połączone z konkretną klasą ścieżką (włącznie z pustą ścieżką) rdfs:subClassOf
właściwości.
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 |
--------------
Wyniki w tym zapytaniu niekoniecznie są uporządkowane według ich pozycji na ścieżce (choć w tym przypadku tak się dzieje). Jeśli potrzebujesz ich w kolejności, możesz to zrobić (opierając się na tej odpowiedzi dotyczącej obliczania pozycji elementów na liście 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)
Spowoduje to znalezienie każdego przodka ?class
z :Win7
jak również każdy ?mid
pośredni przodek. Dla przodka ?class
, odległość jest obliczana jako liczba relacji pośrednich pomiędzy (count(?mid)
). Porządkuje wyniki na podstawie tej odległości, więc :Win7
jest najbliższym przodkiem, :Windows
potem i tak dalej.
Możesz nawet wykonać niektóre z wymyślnych formatów, które chcesz w ten sposób:
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" |
-----------------------------------
może być możliwe, aby wykonać bardziej wyszukane przetwarzanie ciągów i uzyskać ciąg wielowierszowy. Możesz spojrzeć na drugą część tej odpowiedzi gdzie jest trochę fantazyjnego formatowania dla ładnie dopasowanej macierzy pomysłów.