2015-02-10 15 views
5

Principalmente uso SPARQL SELECT mentre lavoro su una query per scopi di debug ma alla fine voglio usare il risultato finale in modo COSTRUTTIVO; perché voglio lavorare con un grafico e non con risultati di query chiave/valore.SPARQL funziona in CONSTRUCT/WHERE

Quello che non ho ancora (e che non riesco a trovare con i motori di ricerca/documenti) è se posso usare anche le funzioni in quel modo. Per fare un esempio, io uso un percorso di proprietà per concatenare titoli che entrare in una "superstringhe", che in seguito io uso per la costruzione di un indice di Lucene per aumentare pianura qualità ricerca:

PREFIX dc: <http://purl.org/dc/elements/1.1/>  

SELECT (group_concat(?title ; separator = " ") AS ?fancytitle) WHERE { 
    GRAPH ?graph { 
    <http://data.staatsarchiv-bs.ch/id/archivalresource/CH-000027-1/pa-633c-a-312-fasc-163> dc:relation+ ?relation . 
    ?relation dc:title ?title . 
    } 
} 

Ora vorrei avere la stessa ?fancytitle come una nuova tripla come

<http://data.staatsarchiv-bs.ch/id/archivalresource/CH-000027-1/pa-633c-a-312-fasc-163> <fancytitle> ?fancytitle . 

Così ho in grado di memorizzare direttamente in un nuovo grafico. È possibile? Ho giocato con alcune domande ma non sono riuscito a farlo accettare dal processore SPARQL. FYI Sto usando Fuseki.

Si può provare al mio SPARQL Endpoint

risposta

3

Con l'aiuto del mio collega siamo arrivati ​​a lavorare, UNION e GROUP BY sono essenziali. Questa query mette la stringa insieme per tutti locah:ArchivalResource nei grafici:

CONSTRUCT 
{ 
    ?archresource skos:hiddenLabel ?supertitle 
} 
WHERE 
{ 
    SELECT ?archresource (group_concat(?title ; separator = ", ") AS ?supertitle) WHERE { 
    GRAPH ?graph { 
     { 
     SELECT ?title ?archresource WHERE { 
      GRAPH ?graph { 
      { 
       ?archresource a locah:ArchivalResource ; 
       dc:title ?title . 
      } UNION 
      { 
       ?archresource dc:relation+ ?relation . 
       ?relation dc:title ?title . 
      } 
      } 
     } 
     } 
    } 
    } GROUP BY ?archresource 
} 
9

Sì questo è possibile

Non è possibile utilizzare le espressioni direttamente in un modello CONSTRUCT ma è possibile assegnare la variabile nella clausola WHERE sia tramite un'espressione SELECT in una sottoquery o utilizzando BIND.

Nel tuo caso come GROUP_CONCAT è un aggregato, può essere solo un'espressione SELECT, quindi devi solo inserire l'intera SELECT come sub-query, ad es.

PREFIX dc: <http://purl.org/dc/elements/1.1/>  

CONSTRUCT 
{ 
    <http://data.staatsarchiv-bs.ch/id/archivalresource/CH-000027-1/pa-633c-a-312-fasc-163> <http://fancyTitle> ?fancytitle 
} 
WHERE 
{ 
    SELECT (group_concat(?title ; separator = " ") AS ?fancytitle) WHERE { 
    GRAPH ?graph { 
     <http://data.staatsarchiv-bs.ch/id/archivalresource/CH-000027-1/pa-633c-a-312-fasc-163> dc:relation+ ?relation . 
     ?relation dc:title ?title . 
    } 
    } 
} 

I lavori di cui sopra bene sul tuo endpoint

+0

Mentre ero già utilizzando sub-query in altre situazioni, non ho pensato a questo, grazie mille! Come sarebbe un 'BIND' per le funzioni non aggregate? –

+0

Domanda successiva, posso ancora sostituire l'URI della risorsa con una variabile in questa query? Come '? Resource a locah: ArchivalResource; '- Ricevo zero risultati in questo modo. Vorrei eseguirlo su tutto ArchivalResource –

+0

Vedere la mia risposta per la query completa, grazie ancora Rob! –