Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SPARQL-Abfrage, um alle Eltern eines Knotens zu erhalten

Ihre Daten können in RDF als data.n3 dargestellt werden :

@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 .

Von hier aus möchten Sie nur eine SPARQL-Abfrage, die alle Dinge findet, die mit einer bestimmten Klasse durch einen Pfad (einschließlich des leeren Pfads) von rdfs:subClassOf verbunden sind Eigenschaften.

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      |
--------------

Die Ergebnisse in dieser Abfrage sind nicht unbedingt nach ihrer Position im Pfad geordnet (obwohl sie es in diesem Fall zufällig sind). Wenn Sie sie in der richtigen Reihenfolge benötigen, können Sie dies tun (basierend auf dieser Antwort zur Berechnung der Position von Elementen in einer RDF-Liste ):

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)

Dies findet jeden Vorfahren ?class von :Win7 sowie jedes ?mid Zwischenvorfahr. Für Vorfahren ?class , wird der Abstand als Anzahl der dazwischen liegenden Beziehungen berechnet (count(?mid)). ). Es ordnet die Ergebnisse basierend auf dieser Entfernung, also :Win7 ist der nächste Vorfahr, :Windows danach usw.

Sie können sogar einige der ausgefallenen Formatierungen wie folgt vornehmen:

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" |
-----------------------------------

Es vielleicht möglich sein, eine ausgefallenere Zeichenfolgenverarbeitung durchzuführen und die mehrzeilige Zeichenfolge zu erhalten. Sie können sich den letzten Teil von dieser Antwort ansehen wo es einige ausgefallene Formatierungen für eine gut ausgerichtete Matrix für Ideen gibt.