2017-07-06 4 views
2

Je suis occupé avec une preuve de concept travaillant avec un magasin triple. J'ai la structure suivante:Requête SPARQL pour une sorte de démarrage avec et de connexion (Oracle)

enter image description here

Il existe 2 types de relation définis (triplets). Relation descendante où l'enfant fait partie de ("isPartOf" son parent et de la gauche vers la droite où il y a des enfants CAN (optionnel) remplacés ("remplace") par une autre version de l'enfant

avoir un tri "isValidStart" avec une date comme objet Cela signifie que cet enfant est valide depuis cette date Le dernier enfant d'un groupe enfant horizontal peut avoir une relation "isInvalidEnd" qui signifie qu'après cette date, ce groupe est invalide

ce que je veux faire est de construire une requête SPARQL où je peux obtenir les Childs d'un parent à une date précise. est-ce possible avec SPARQL et comment puis-je faire?

Je sais t Il y a dans Oracle n'importe quel type de fonction START WITH/CONNECT BY qui fait quelque chose de ce genre ... mais comment est-ce que je fais cela dans le monde de SPARQL.

Merci

</metadata/puid/test2> <http://purl.org/dc/terms/isPartOf> "/metadata/puid/test1" . 
</metadata/puid/test2> <http://purl.org/dc/terms/isValidStart> "2015-04-01"^^<http://www.w3.org/2001/XMLSchema#date> . 
</metadata/puid/test3> <http://purl.org/dc/terms/isPartOf> "/metadata/puid/test2" . 
</metadata/puid/test3> <http://purl.org/dc/terms/isValidStart> "2015-04-01"^^<http://www.w3.org/2001/XMLSchema#date> . 
</metadata/puid/test4> <http://purl.org/dc/terms/isPartOf> "/metadata/puid/test3" . 
</metadata/puid/test4> <http://purl.org/dc/terms/isValidStart> "2015-04-01"^^<http://www.w3.org/2001/XMLSchema#date> . 
</metadata/puid/test5> <http://purl.org/dc/terms/isPartOf> "/metadata/puid/test4" . 
</metadata/puid/test5> <http://purl.org/dc/terms/isValidStart> "2015-04-01"^^<http://www.w3.org/2001/XMLSchema#date> . 
</metadata/puid/test6> <http://purl.org/dc/terms/isPartOf> "/metadata/puid/test4" . 
</metadata/puid/test6> <http://purl.org/dc/terms/isValidStart> "2015-04-01"^^<http://www.w3.org/2001/XMLSchema#date> . 
</metadata/puid/test7> <http://purl.org/dc/terms/isPartOf> "/metadata/puid/test4" . 
</metadata/puid/test7> <http://purl.org/dc/terms/isValidStart> "2015-04-01"^^<http://www.w3.org/2001/XMLSchema#date> . 
</metadata/puid/test8> <http://purl.org/dc/terms/replaces> "/metadata/puid/test7" . 
</metadata/puid/test8> <http://purl.org/dc/terms/isValidStart> "2015-07-01"^^<http://www.w3.org/2001/XMLSchema#date> . 
</metadata/puid/test9> <http://purl.org/dc/terms/isPartOf> "/metadata/puid/test5" . 
</metadata/puid/test9> <http://purl.org/dc/terms/isValidStart> "2015-04-01"^^<http://www.w3.org/2001/XMLSchema#date> . 
</metadata/puid/test10> <http://purl.org/dc/terms/isPartOf> "/metadata/puid/test5" . 
</metadata/puid/test10> <http://purl.org/dc/terms/isValidStart> "2015-04-01"^^<http://www.w3.org/2001/XMLSchema#date> . 
</metadata/puid/test11> <http://purl.org/dc/terms/isPartOf> "/metadata/puid/test5" . 
</metadata/puid/test11> <http://purl.org/dc/terms/isValidStart> "2015-04-01"^^<http://www.w3.org/2001/XMLSchema#date> . 
</metadata/puid/test12> <http://purl.org/dc/terms/replaces> "/metadata/puid/test9" . 
</metadata/puid/test12> <http://purl.org/dc/terms/isValidStart> "2015-07-01"^^<http://www.w3.org/2001/XMLSchema#date> . 
</metadata/puid/test13> <http://purl.org/dc/terms/replaces> "/metadata/puid/test10" . 
</metadata/puid/test13> <http://purl.org/dc/terms/isValidStart> "2015-05-01"^^<http://www.w3.org/2001/XMLSchema#date> . 
</metadata/puid/test14> <http://purl.org/dc/terms/replaces> "/metadata/puid/test13" . 
</metadata/puid/test14> <http://purl.org/dc/terms/isValidStart> "2015-08-01"^^<http://www.w3.org/2001/XMLSchema#date> . 
</metadata/puid/test14> <http://purl.org/dc/terms/isValidEnd> "2015-12-01"^^<http://www.w3.org/2001/XMLSchema#date> . 

// Disclaimer: Je suis nouveau dans le monde SPARQL

+2

Pouvez-vous afficher les données RDF, s'il vous plaît? Et oui, c'est assez facilement faisable avec SPARQL – AKSW

+0

J'ajoute le triple. Il y a quelques "remplacements" avec des "documents" mis à jour qui devraient choisir le bon en fonction de la date de sélection –

+0

Ok, merci Cela signifie-t-il que a) donné une date d'un parent (groupe) que vous voulez avoir tous ses enfants ou b) voulez-vous avoir seulement les enfants qui sont valides pour la date donnée? – AKSW

Répondre

1

J'ai travaillé sur une solution et j'ai trouvé une solution de travail. J'ai mis cette méthode dans une fonction que je peux utiliser pour trouver les enfants valides en dessous de cet élément (parent). Je reçois un arbre complet, avec seulement des éléments valides, lorsque j'appelle cette fonction récursivement.

PREFIX : <http://purl.org/dc/terms/> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 

SELECT ?child ?startDate ?endDate 
WHERE 
{ 
    # get the valid start values 
    ?child :isValidStart ?startDate 


    BIND(iri("'||$parent||'") as ?parent) 
    FILTER EXISTS{ {?child :isPartOf ?parent } 
        UNION { 
        ?child (:replaces)+ ?prevVersion . 
        ?prevVersion :isPartOf ?parent 
        } 
       } 
    # and there was no other valid replacing child 
    FILTER NOT EXISTS { ?replacer :replaces ?child ; 
            :isValidStart ?startDateReplacer 
         FILTER (?startDateReplacer <= "'||$selectionDate||'"^^xsd:date) 
         } 

    # where the start was before/at the given date 
    FILTER(?startDate <= "'||$selectionDate||'"^^xsd:date) 

    OPTIONAL { ?child :isValidEnd ?endDate } 

    # and not end date is before/at selection date   
    FILTER NOT EXISTS { FILTER (?endDate <= "'||$selectionDate||'"^^xsd:date) }   
} 
+0

Je ne suis pas sûr si c'est la solution la plus simple mais elle donne le résultat attendu. J'apprends toujours SPARQL (nouveau dans cette technologie) –

2

Pas tout à fait sûr que ce soit ce que vous demandez mais les commentaires en ligne:

Date données: "2015-04-01"^^xsd:date

PREFIX : <http://purl.org/dc/terms/> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 

SELECT ?child 
WHERE 
    { 
    # we have two options to check 
    # 1. all children that have not been replaced 
     { 
     # get the valid start values 
     ?child :isValidStart ?start 
     # where the start was before the given date 
     FILTER (?start < "2015-04-01"^^xsd:date) 
     # and there was no other replacing child 
     FILTER NOT EXISTS { ?otherChild :replaces ?child } 
     } 
    UNION 
    # 2. children that haven been replaced 
     { 
     # start date of children that replace others 
     ?child :isValidStart ?start ; 
       :replaces  ?someChild 
     # but haven not been replaced themselves 
     FILTER NOT EXISTS { ?otherChild :replaces ?child } 
     # where the start was before the given date 
     FILTER(?start < "2015-04-01"^^xsd:date) 
     # and there isn't an end date before the given date 
     FILTER NOT EXISTS { ?child :isValidEnd ?end 
          FILTER (?end < "2015-04-01"^^xsd:date) 
          } 
     } 
    } 
+0

Merci pour cette solution. Je vais tester les résultats plus tard dans la journée et confirmer si cela fonctionne, je pense que c'est correct ou proche de –

+1

Je suppose que ce n'est pas ce que vous voulez, mais ensuite je vais adapter la requête. et le résultat attendu basé sur vos données d'échantillon déjà données – AKSW

+0

Il retourne maintenant tous les enfants valides et pas seulement les dernières versions valides des enfants? Comment voulez-vous avoir les données d'échantillon? Ce n'est qu'un simple document XML "emtpy" pour l'instant comme: https://pastebin.com/TZVLgJn7 Je peux vous livrer un script MarkLogic XQuery pour insérer toutes les données dans MarkLogic mais je ne sais pas quel format vous exige. –