sql >> Databáze >  >> RDS >> Mysql

Dotaz SPARQL pro získání všech rodičů uzlu

Vaše data mohou být v RDF reprezentována 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 .

Odtud chcete pouze dotaz SPARQL, který najde všechny věci spojené s konkrétní třídou cestou (včetně prázdné cesty) rdfs:subClassOf vlastnosti.

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

Výsledky v tomto dotazu nemusí být nutně seřazeny podle jejich pozice v cestě (i když v tomto případě jsou). Pokud je potřebujete v pořádku, můžete to udělat (což je založeno na této odpovědi o výpočtu pozice prvků v seznamu 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)

Toto najde každého předka ?class z :Win7 stejně jako každý ?mid mezipředek. Pro předka ?class , vzdálenost se vypočítá jako počet mezilehlých vztahů mezi nimi (count(?mid) ). Výsledky seřadí na základě této vzdálenosti, takže :Win7 je nejbližší předek, :Windows poté a tak dále.

Můžete dokonce provést některé z efektních formátování, které chcete, takto:

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

Mohlo by být možné provést nějaké lepší zpracování řetězce a získat víceřádkový řetězec. Můžete se podívat na druhou část této odpovědi kde je nějaké efektní formátování pro pěkně zarovnanou matici pro nápady.




  1. Změňte velikost názvů tabulek/sloupců/indexů v oracle 11g nebo 12c

  2. Pět hlavních úvah pro návrh indexu databáze na serveru SQL Server

  3. Android Studio nekontroluje/nezvýrazní dotazy Kotlin Room DAO, když řetězec zabírá více než 1 řádek

  4. Migrace databáze Laravel - chyba přejmenování sloupce - Je požadován výčet neznámého typu databáze