2010-07-21 1 views
3

que je fais une requête SPARQL sur le DBpediaset, mais je rencontre quelques problèmes (en raison du manque de connaissances SPARQL détaillées) avec une limitation de la requête:SPARQL skos: plus large

je suis « get » tous les artistes de la musique :

?person rdf:type <http://dbpedia.org/ontology/MusicalArtist> . 

Mais je veux limiter à la catégorie plus large Category:American_musicians (via la traversée skos:broader?): comment?

* = alors que la question est spécifique, j'ai rencontré cette quête plusieurs fois en voulant exécuter des requêtes sparql.

+1

Je pense que vous voudriez un moteur sparql avec un raisonnement pour le faire, en théorie le moteur peut savoir que Broarder est transative et perfrom la requête. Cependant, ce n'est pas quelque chose que vous pouvez obtenir en standard. –

Répondre

1

Il n'y a pas vraiment bonne façon de le faire, mais voici une façon prolixe:

SELECT DISTINCT (?person) 
WHERE 
{ 
    ?person rdf:type dbpedia-owl:MusicalArtist . 
    { 
    ?person skos:subject [ skos:broader category:American_musicians ] . 
    } UNION { 
    ?person skos:subject [ skos:broader [ skos:broader category:American_musicians ] ] . 
    } UNION { 
    ?person skos:subject [ skos:broader [ skos:broader [ skos:broader category:American_musicians ] ] ] . 
    } UNION { 
    ?person skos:subject [ skos:broader [ skos:broader [ skos:broader [ skos:broader category:American_musicians ] ] ] ] . 
    } UNION { 
    ?person skos:subject [ skos:broader [ skos:broader [ skos:broader [ skos:broader [ skos:broader category:American_musicians ] ] ] ] ] . 
    } UNION { 
    ?person skos:subject [ skos:broader [ skos:broader [ skos:broader [ skos:broader [ skos:broader [ skos:broader category:American_musicians ] ] ] ] ] ] . 
    } UNION { 
    ?person skos:subject [ skos:broader [ skos:broader [ skos:broader [ skos:broader [ skos:broader [ skos:broader [ skos:broader category:American_musicians ] ] ] ] ] ] ] . 
    } 
} 

Pour déterminer combien de niveaux vous avez besoin, vous pouvez changer SELECT DISTINCT SELECT COUNT DISTINCT et arrêter d'ajouter des niveaux lorsque le compte arrête de monter.

0

Ceci est vraiment facile à réaliser dans neo4j. Une alternative pour accomplir votre tâche dans SPARQL pourrait être d'extraire tout le sous-graphique sous "Category: American_musicians" en itérant par code sur les sous-catégories.

Par exemple. pseudo-code en Java serait quelque chose comme:

String startCategory = "<http://dbpedia.org/resource/Category:American_musicians>"; 
iterateTraversalFunction(startCategory); 

alors la fonction traversal serait:

public void iterateTraversalFunction(String startCategory){ 
    ArrayList<String> artistsURI = // SPARQL query ?person skos:subject startCategory . ?person rdf:type MusicalArtist 

    ArrayList<String> subCategoriesURI = // SPARQL query ?subCat skos startCategory 
    // Repeat recursively 
    for(String subCatURI: subCategoriesURI){ 
     iterateTraversalFunction(subCatURI); 
    } 
} 

Hope this helps, - Dan

4

Cela peut être plus facile avec les chemins de propriété en SPARQL 1.1

SELECT DISTINCT (?person) 
WHERE 
{ 
    ?person rdf:type dbpedia-owl:MusicalArtist . 
    ?person skos:subject skos:broader* category:American_musicians . 
} 

Ici, il affiche tous les ancêtres qui pourraient b e atteint via la propriété skos:broader.

+0

Où puis-je trouver un point de terminaison SPARQL 1.1 DBpedia? J'ai essayé de mettre la requête dans snorql mais elle a échoué: http://dbpedia.org/snorql/?query=SELECT+DISTINCT+%28+%3Fperson+%29%0D%0AWHERE%0D%0A%7B%0D%0A++%3Fperson + rdf% 3Atype + dbpedia-owl% 3AMusicalArtist +.% 0D% 0A ++% 3Fperson + skos% 3Asubject ++ skos% 3Abroader * + catégorie% 3AAmerican_musicians ++.% 0D% 0A% 7D – dranxo

1

Je suis étonné cette question simple n'a pas été répondu correctement dans 3 ans, et combien d'incertitude et de doute les gens se propagent.

SELECT * { ?person a dbo:MusicalArtist . filter exists {?person dct:subject/skos:broader* dbc:American_musicians} }

  • corrigé quelques préfixes: dbo au lieu de la longue dbpedia-owl, dbc au lieu de category. Ces courts préfixes sont BUILTIN DBpedia
  • skos:subject corrigé (pas un tel accessoire existe) pour dct:subject
  • corrigé la requête avec des chemins de propriété, il ne manquait /
  • skos:broader est pas transitive, skos:broaderTransitive est. Cependant, DBpedia n'a pas ce dernier (aucun raisonnement transitif)
  • remplacé DISTINCT qui est cher avec FILTER EXISTS qui est beaucoup plus rapide. Le FILTER peut s'arrêter à la première sous-catégorie pertinente qu'il trouve, tandis que la requête originale trouve d'abord tous ces sous-chats par artiste, puis les supprime (DISTINCT), trie les artistes en mémoire et supprime les doublons.
+0

FWIW Certaines réponses ont 5 ans. Je crois qu'à l'époque, le point de terminaison DBPedia avait un support très incomplet pour les chemins de propriétés. –