Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zapytanie SPARQL, aby uzyskać wszystkich rodziców węzła

Twoje dane mogą być reprezentowane w RDF 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 .

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

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

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

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę uzyskać ostatnio wstawiony identyfikator za pomocą Hibernate?

  2. jaki jest pożytek z opcji pool w database.yml?

  3. MySQL Injection - Użyj zapytania SELECT do UPDATE/DELETE

  4. Obsługa transakcji w MySQL

  5. Uzyskaj STARĄ wartość w wyzwalaczu MySQL po oświadczeniu o aktualizacji