2017-05-30 1 views
0

J'ai un ensemble de données interne de triples. J'essaye de mettre en application une caractéristique de typeahead pour une application utilisant l'ensemble de données.Sparql - Traverser vers le haut (le plus large)

J'essaie de comprendre comment je peux conditionnelle traverser à Top Concept

enter image description here

Dans cette image, si je recherchais dreamworks, il serait 3 couches vers le bas (organisations d'entreprises - > Société privée -> Dreamworks).

Si je fais quelque chose d'autre, évidemment, ce sera à différentes couches du graphique. J'essaye d'obtenir la valeur "Organisation" ou "Personne" comme le plus haut niveau.

Cette requête très simple fonctionne.

 SELECT DISTINCT ?subjectPrefLabel ?a ?b ?o 
    WHERE 
     { 
      ?subject skosxl:prefLabel/skosxl:literalForm ?subjectPrefLabel . 
    ?subject skos:broader/skos:broader/skos:broader/skosxl:prefLabel/skosxl:literalForm ?a 


    FILTER regex(?subjectPrefLabel, "Dreamworks", 'i') 
     } 
    ORDER BY ?subjectPrefLabel 

enter image description here

Cependant, cela est évidemment insoutenable, puisque le développeur aurait besoin de savoir combien de niveaux dans la hiérarchie afin de délivrer le nombre correct de skos:broader.

Y at-il de toute façon, je peux conditionnellement découvrir le plus haut niveau de la hiérarchie?

Comme il s'agit d'une ontologie interne, je ne peux partager aucune donnée, donc je sais que ce sera difficile de travailler avec, tout conseil est apprécié.

Répondre

1

Utilisation de l'opérateur star kleene * une combinaison avec FILTER qu'il n'y est plus large concept devrait retourner les concepts haut seulement:

SELECT DISTINCT ?subjectPrefLabel ?a ?b ?o WHERE { 
    ?subject skosxl:prefLabel/skosxl:literalForm ?subjectPrefLabel . 
    ?subject skos:broader* ?concept. 
    ?concept skosxl:prefLabel/skosxl:literalForm ?a 
    FILTER NOT EXISTS { ?concept skos:broader ?supConcept } 
    FILTER regex(?subjectPrefLabel, "Dreamworks", 'i') 
} 
ORDER BY ?subjectPrefLabel