2010-05-28 5 views
41

chaque fois que je commence à utiliser sql j'ai tendance à lancer quelques instructions exploratoires dans la base de données afin de comprendre ce qui est disponible et la forme que prennent les données.requêtes SPARQL exploratoires?

par ex.

show tables 

describe table 

select * from table 

quelqu'un pourrait me aider à comprendre la façon de compléter une exploration similaire d'un datastore rdf en utilisant un point final SPARQL?

Merci de

Répondre

69

Eh bien, le premier départ évident est de regarder les classes et les propriétés présentes dans les données.

Voici comment voir ce que les classes sont utilisées:.

SELECT DISTINCT ?class 
WHERE { 
    ?s a ?class . 
} 
LIMIT 25 
OFFSET 0 

(LIMIT et OFFSET sont là pour la pagination Il convient de se habituer à ces surtout si vous envoyez votre requête sur Internet I. « ll les omettent dans les autres exemples)

a est un SPARQL spécial (et Notation3/Turtle) syntaxe pour représenter le rdf:type prédicat -. ce cas, des liens individuels type owl:Class/rdfs:Class s (à peu près équivalent aux tables dans les RDBMS SQL).

Deuxièmement, vous voulez regarder les propriétés. Vous pouvez le faire soit en utilisant les classes que vous avez recherchées ou simplement en recherchant des propriétés. Obtenons juste toutes les propriétés du magasin:

SELECT DISTINCT ?property 
WHERE { 
    ?s ?property ?o . 
} 

Cela obtenir toutes les propriétés, vous n'êtes probablement pas intéressé par ce qui équivaut à une liste de toutes les colonnes de ligne dans SQL, mais sans. tout regroupement par la table.

Plus utile est de voir quelles propriétés sont utilisées par des instances qui déclarent une classe particulière:

SELECT DISTINCT ?property 
WHERE { 
    ?s a <http://xmlns.com/foaf/0.1/Person>; 
    ?property ?o . 
} 

Cela vous récupérer les propriétés utilisées sur toutes les instances qui satisfont la première triple - à savoir, qui ont le rdf:type de http://xmlns.com/foaf/0.1/Person. Rappelez-vous, car une ressource rdf: Resource peut avoir plusieurs propriétés rdf: type - des classes si vous voulez - et parce que le modèle de données de RDF est additif, vous n'avez pas de problème de diamant. Le type est juste une autre propriété - c'est juste un accord social utile pour dire que certaines choses sont des personnes ou des chiens ou des gènes ou des équipes de football. Cela ne signifie pas que le magasin de données contiendra des propriétés généralement associées à ce type. Le type ne garantit rien en termes de propriétés qu'une ressource peut avoir.

Vous devez vous familiariser avec le modèle de données et l'utilisation de la syntaxe UNION et OPTIONAL de SPARQL. Le mappage approximatif de rdf: type aux tables SQL est juste que - rough.

Vous pouvez connaître le type d'entité vers lequel pointe la propriété. Premièrement, vous voulez probablement connaître les propriétés des types de données - équivalentes aux littéraux ou aux primitives. Vous savez, les chaînes, les entiers, etc. RDF définit ces littéraux comme héritant de la chaîne.Nous pouvons filtrer ces propriétés qui sont littéraux selon la méthode du filtre SPARQL isLiteral:

SELECT DISTINCT ?property 
WHERE { 
    ?s a <http://xmlns.com/foaf/0.1/Person>; 
    ?property ?o . 
    FILTER isLiteral(?o) 
} 

Nous limiterons ici pour obtenir des propriétés qui ont pour objet un littéral - une chaîne, date-heure, booléen, ou l'un des autres types de données XSD.

Mais qu'en est-il des objets non-littéraux? Considérez cette définition de classe pseudo-Java très simple comme une analogie:

public class Person { 
    int age; 
    Person marriedTo; 
} 

Utilisation de la requête ci-dessus, nous retrouverais le littéral qui représenterait l'âge si la propriété d'âge est lié. Mais marriedTo n'est pas une primitive (c'est-à-dire un littéral dans les termes RDF) - c'est une référence à un autre objet - dans la terminologie RDF/OWL, c'est une propriété d'objet. Mais nous ne savons pas quel type d'objets sont référencés par ces propriétés (prédicats). Cette requête vous permettra de récupérer les propriétés avec les types qui les accompagnent.

SELECT DISTINCT ?property, ?class 
WHERE { 
    ?s a <http://xmlns.com/foaf/0.1/Person>; 
    ?property ?o . 
    ? a ?class . 
    FILTER(!isLiteral(?o)) 
} 

Cela devrait être suffisant pour vous orienter dans un ensemble de données particulier. Bien sûr, je vous recommande également de retirer quelques ressources individuelles et de les inspecter. Vous pouvez le faire en utilisant la requête DESCRIBE:

DESCRIBE <http://example.org/resource> 

Il y a quelques outils SPARQL - SNORQL, par exemple - que vous permettent de le faire dans un navigateur. L'instance de SNORQL à laquelle j'ai été associé contient un exemple de requête pour explorer les graphes nommés possibles, que je n'ai pas abordés ici.

Si vous n'êtes pas familier avec SPARQL, honnêtement, la meilleure ressource si vous êtes bloqué est la spécification. C'est une spécification W3C mais assez bonne (ils ont construit une suite de tests décent pour que vous puissiez voir si les implémentations l'ont bien fait) et si vous pouvez vous débarrasser du langage compliqué, c'est très utile.

+0

à plat réponse impressionnante - merci Tom! – significance

+0

Je sais que je ne suis pas censé poster simple "Merci!"messages sur SO, mais vous venez d'aider sérieusement un Noob SPARQL, donc:" Merci! ". –

1

Je me réfère souvent à ce list of queries from the voiD project. Ils sont principalement de nature statistique, mais pas seulement. Il ne devrait pas être difficile de supprimer COUNT de certaines instructions pour obtenir les valeurs réelles.

6

je trouve l'ensemble suivant des requêtes exploratoires utiles:

En voyant les classes:

select distinct ?type ?label 
where { 
    ?s a ?type . 
    OPTIONAL { ?type rdfs:label ?label } 
} 

Voir les propriétés:

select distinct ?objprop ?label 
where { 
    ?objprop a owl:ObjectProperty . 
    OPTIONAL { ?objprop rdfs:label ?label } 
} 

Voir les propriétés de données:

select distinct ?dataprop ?label 
where { 
    ?dataprop a owl:DatatypeProperty . 
    OPTIONAL { ?dataprop rdfs:label ?label } 
} 

Seeing dont les propriétés sont effectivement utilisées:

select distinct ?p ?label 
where { 
    ?s ?p ?o . 
    OPTIONAL { ?p rdfs:label ?label } 
} 

En voyant ce que les entités sont affirmés:

select distinct ?entity ?elabel ?type ?tlabel 
where { 
    ?entity a ?type . 
    OPTIONAL { ?entity rdfs:label ?elabel } . 
    OPTIONAL { ?type rdfs:label ?tlabel } 
} 

Voir les graphiques distincts utilisés:

select distinct ?g where { 
    graph ?g { 
     ?s ?p ?o 
    } 
}