Uw gegevens kunnen in RDF worden weergegeven als 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 .
Vanaf hier wil je gewoon een SPARQL-query die alle dingen vindt die met een bepaalde klasse zijn verbonden via een pad (inclusief het lege pad) van rdfs:subClassOf
eigenschappen.
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 |
--------------
De resultaten in die zoekopdracht zijn niet noodzakelijkerwijs geordend op hun positie in het pad (hoewel ze dat in dit geval wel zijn). Als je ze op volgorde nodig hebt, kun je dit doen (gebaseerd op dit antwoord over het berekenen van de positie van elementen in een RDF-lijst ):
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)
Dit vindt elke voorouder ?class
van :Win7
evenals elke ?mid
tussenliggende voorouder. Voor voorouder ?class
, wordt de afstand berekend als het aantal tussenliggende relaties tussen (count(?mid)
). Het ordent de resultaten op basis van die afstand, dus :Win7
is de dichtstbijzijnde voorouder, :Windows
daarna, enzovoort.
Je kunt zelfs een aantal van de mooie opmaak die je wilt als volgt doen:
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" |
-----------------------------------
Het misschien mogelijk zijn om wat exclusievere stringverwerking te doen en om de multiline-string te krijgen. Je zou kunnen kijken naar het laatste deel van dit antwoord waar er een mooie opmaak is voor een mooi uitgelijnde matrix voor ideeën.