Mysql
 sql >> база данни >  >> RDS >> Mysql

SPARQL заявка за получаване на всички родители на възел

Вашите данни могат да бъдат представени в RDF като 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 .

От тук вие просто искате SPARQL заявка, която намира всички неща, свързани с конкретен клас чрез път (включително празния път) на rdfs:subClassOf свойства.

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

Резултатите в тази заявка не са непременно подредени според позицията им в пътя (въпреки че в този случай те се случват). Ако имате нужда от тях в ред, можете да направите това (което се основава на този отговор за изчисляване на позицията на елементи в 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)

Това намира всеки предшественик ?class на :Win7 както и всяка ?mid междинен прародител. За предшественик ?class , разстоянието се изчислява като броя на междинните отношения между тях (count(?mid) ). Той подрежда резултатите въз основа на това разстояние, така че :Win7 е най-близкият предшественик, :Windows след това и т.н.

Можете дори да направите някои от изисканото форматиране, което искате, така:

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

Може да бъде възможно да се направи по-изискана обработка на низове и да се получи многоредовият низ. Може да разгледате последната част на този отговор където има някакво изискано форматиране за добре подравнена матрица за идеи.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL комбинира две колони и добавете в нова колона

  2. MySQL timestamp изберете период от време

  3. MySQL родителски деца избор на една заявка

  4. Как да предотвратим едновременни влизания на потребители в сайта на PHP/MySQL?

  5. Как работи функцията FROM_BASE64() в MySQL