sql >> Database >  >> RDS >> Mysql

SPARQL-query om alle ouder van een knooppunt te krijgen

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.




  1. Hoe UUID() werkt in MariaDB

  2. mysql-equivalente gegevenstypen

  3. MySQL retourneert eerste en laatste record voor opeenvolgende identieke resultaten

  4. Hoe selecteer ik kolommen uit een tabel die niet-null-waarden hebben?