2016-08-05 15 views
0

Meine Abfrage gibt das Ergebnis zurück, abhängig davon, welche von zwei SPARQL-OPTIONS-Klauseln für eine Liste von Bildern an erster Stelle steht. Obwohl die Verwendung von Jena ARQ zu diesem Zeitpunkt keine Option ist und ich dies gerne mit einer reinen SPARQL-Abfrage lösen würde, würde ich gerne wissen, wie es auch mit Jena gelöst werden könnte. Meine Datenpräsentation ist unten angehängt, die Daten können eine Liste von Bildern enthalten. Meine Bilddarstellung ist auch unten. Ich füge auch meine Anfrage an. Die sprql-Abfrage enthält zwei Variablen urlX und urlY, die in den 2 OPTIONS-Blöcken deklariert sind, wenn eine Liste von Bildern existiert. Abhängig davon, welche der OPTIONEN zuerst kommt, erhalte ich den Wert für diese eine Variable, während die andere nicht erreicht wird. Es scheint, dass das Problem mit der Verwendung der OPTIONS-Klausel zu tun hat. Ich bin mir nicht sicher, was ich sonst noch versuchen könnte, ich bin weit davon entfernt, Experte für Sparql-Abfragen zu sein. Ich möchte, dass die Abfrage folgendes ausführt: Wenn eine Sammlung von Bildern vorhanden ist, möchte ich sehen, ob beide Bildgrößen (dc: conformsTo) vorhanden sind und sowohl urlX- als auch urlY-Werte erhalten oder die vorhandenen erhalten. Viel schätzen Sie Ihre Zeit.Sparql-Abfrage: Abrufen mehrerer Werte aus einer Liste

Meine Datendarstellung:

@prefix dc: <http://purl.org/dc/terms/> . 
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . 
@prefix lews: <http://lews.com/content/> . 
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 

lews:26331340 lews:name "the Human Good Luck Charm is Back"^^xsd:token ; 
     dc:created "2014-10-20T17:14:55.357-07:00"^^xsd:dateTime ; 
     dc:identifier "26331340"^^xsd:int ; 
     dc:modified "2016-08-04T13:43:00.897-07:00"^^xsd:dateTime ; 
     dc:title "the Human Good Luck Charm is Back" ; 
     dc:hasPart <http://lews.com/content/26331340#Images> ; 
     dc:abstract "As the World Series gets underway..." ; 
     dc:description "The super fan who rooted for the Royals is back to boost morale." ; 
     dc:subject "hoping for a World Series victory". 

<http://lews.com/content/26331340#Images> dc:identifier "Images"^^xsd:token ; 
     rdf:first lews:26331375 ; 
     rdf:rest _:genid-15e530b0195547d9ac3f8e5e6785a747-x26331340Images26331376 ; 
     rdf:li <http://lews.com/content/26331340#Images> , _:genid-15e530b0195547d9ac3f8e5e6785a747-x26331340Images26331376 , _:genid-15e530b0195547d9ac3f8e5e6785a747-x26331340Images26331377 , _:genid-15e530b0195547d9ac3f8e5e6785a747-x26331340Images26331378 , _:genid-15e530b0195547d9ac3f8e5e6785a747-x26331340Images26331379 , _:genid-15e530b0195547d9ac3f8e5e6785a747-x26331340Images26331380 ; 
     a rdf:List . 

_:genid-15e530b0195547d9ac3f8e5e6785a747-x26331340Images26331376 rdf:first lews:26331376 ; 
     rdf:rest _:genid-15e530b0195547d9ac3f8e5e6785a747-x26331340Images26331377 . 

_:genid-15e530b0195547d9ac3f8e5e6785a747-x26331340Images26331377 rdf:first lews:26331377 ; 
     rdf:rest _:genid-15e530b0195547d9ac3f8e5e6785a747-x26331340Images26331378 . 

_:genid-15e530b0195547d9ac3f8e5e6785a747-x26331340Images26331378 rdf:first lews:26331378 ; 
     rdf:rest _:genid-15e530b0195547d9ac3f8e5e6785a747-x26331340Images26331379 . 

_:genid-15e530b0195547d9ac3f8e5e6785a747-x26331340Images26331379 rdf:first lews:26331379 ; 
     rdf:rest _:genid-15e530b0195547d9ac3f8e5e6785a747-x26331340Images26331380 . 

_:genid-15e530b0195547d9ac3f8e5e6785a747-x26331340Images26331380 rdf:first lews:26331380 ; 
     rdf:rest rdf:nil . 

Meine Bilddarstellung:

@prefix dc: <http://purl.org/dc/terms/> . 
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . 
@prefix lews: <http://abcnews.com/content/> . 
@prefix mrss: <http://search.yahoo.com/mrss/> . 

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 

lews:26331376 lews:name "141020_wn_donvan0_704x396.jpg"^^xsd:token ; 
     lews:section "wnt"^^xsd:token ; 
     lews:type "Image"^^xsd:token ; 
     dc:conformsTo "704x396"^^xsd:token ; 
     dc:created "2014-10-20T17:15:09.637-07:00"^^xsd:dateTime ; 
     dc:hasFormat <http://lews.go.com/images/WNT/141020_wn_donvan0_704x396.jpg> ; 
     dc:identifier "26331376"^^xsd:int ; 
     dc:isPartOf <http://lews.go.com/WNT> ; 
     dc:modified "2014-10-20T17:15:09.947-07:00"^^xsd:dateTime ; 
     dc:type "StillImage"^^xsd:token ; 
     mrss:height "396"^^xsd:int ; 
     mrss:width "704"^^xsd:int ; 
     xsd:date "2014-10-20"^^xsd:date ; 
     xsd:gMonthDay "--10-20"^^xsd:gMonthDay ; 
     xsd:gYear "2014"^^xsd:gYear ; 
     xsd:gYearMonth "2014-10"^^xsd:gYearMonth . 

Meine Frage:

PREFIX dc:  <http://purl.org/dc/terms/> 
PREFIX mrss: <http://search.yahoo.com/mrss/> 
PREFIX search: <http://www.openrdf.org/contrib/lucenesail#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
PREFIX lews: <http://abcnews.com/content/> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 

SELECT ?id ?title ?description ?urlX ?urlY ?section ?imgName 
    ?subject dc:identifier ?id. 

    OPTIONAL {?subject dc:title ?title.} 
    OPTIONAL {?subject dc:description ?description.} 
    OPTIONAL {?subject dc:isPartOf ?section.} 

    OPTIONAL { 
       ?subject dc:hasPart ?imageCol. 
       ?imageCol dc:identifier "Images"^^xsd:token. 

       OPTIONAL{ 
        ?imageCol rdf:li ?bnode. 
        ?bnode rdf:first ?image. 
        ?image lews:name ?imgName;        
          dc:conformsTo "4x3"; 
          dc:hasFormat ?urlX.         
       }   
       OPTIONAL{ 
        ?imageCol rdf:li ?bnode. 
        ?bnode rdf:first ?image. 
        ?image lews:name ?imgName;        
          dc:conformsTo "16x9"; 
          dc:hasFormat ?urlY.         
       }   

    } 

} 
LIMIT ${limit} 
+1

Sie können Aggregation und Gruppe nach dem Datenelement verwenden und dann 'SAMPLE' verwenden, um ein Bildmuster auszuwählen. Aber zuerst denke ich, dass Sie die Listen in einer Unterauswahl auflösen müssen, indem Sie die lustigen SPARQL 1.1-Eigenschaftenpfade verwenden, wie z. hier: http://stackoverflow.com/questions/17523804/is-it-possible-to-get-the-position-of-an-element-in-an-rdf-collection-in-sparql – AKSW

+0

Ich habe einen Blick Bei der Aggregation sehe ich nicht, wie es mit meinen Daten funktionieren würde. – user2917629

Antwort

1

Wenn ich das richtig verstanden, was es ist, dass Sie möchten, müssen Sie nur gruppieren Sie die Optionen anders:

PREFIX dc:  <http://purl.org/dc/terms/> 
PREFIX mrss: <http://search.yahoo.com/mrss/> 
PREFIX search: <http://www.openrdf.org/contrib/lucenesail#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
PREFIX lews: <http://abcnews.com/content/> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 

SELECT ?id ?title ?description ?urlX ?urlY ?section ?imgName { 
    ?subject dc:identifier ?id. 

    OPTIONAL { ?subject dc:title ?title. } 
    OPTIONAL { ?subject dc:description ?description. } 
    OPTIONAL { ?subject dc:isPartOf ?section. } 

    OPTIONAL { 
     ?subject dc:hasPart ?imageCol. 
     ?imageCol dc:identifier "Images"^^xsd:token. 

     OPTIONAL { 
      ?imageCol rdf:li ?bnode. 
      ?bnode rdf:first ?image. 
      ?image lews:name ?imgName; 
      # Here we optionally bind ?urlX and/or ?urlY 
      OPTIONAL { 
       ?image dc:conformsTo "4x3"; 
        dc:hasFormat ?urlX. 
      } 
      OPTIONAL { 
       ?image dc:conformsTo "16x9"; 
        dc:hasFormat ?urlY. 
      } 
     } 
    } 
} 
Verwandte Themen