Twoje dane mogą być reprezentowane w RDF jako data.n3 :
@prefix : <https://example.org/> .
@prefix rdfs: <https://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 : <https://example.org/>
prefix rdfs: <https://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 : <https://example.org/>
prefix rdfs: <https://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 : <https://example.org/>
prefix rdfs: <https://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), "https://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.