2013-02-26 15 views
6

Sto provando a creare un grafico RDF da un archivio RDF Mulgara, utilizzando una query Sparql per restituire i risultati. Sto appena cominciando a sentirmi a mio agio con domande semplici, chiedendo in modo efficace "quali oggetti sono membri di una particolare collezione?"Query ricorsive in SPARQL per sfogliare raccolte di collezioni

La mia domanda è, e sarei molto grato, se posso prendere i risultati da questa semplice query e reindirizzarli come oggetto della query?

Ad esempio, ho questa query SPARQL:

SELECT ?x WHERE {?x <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey>} 

Con questi risultati:

"x" 
info:fedora/ramsey:ThelifeandadventuresofRobinsonCrusoe 
info:fedora/ramsey:Jackanapes 
info:fedora/ramsey:SundayJournalvol01no0219951126 
info:fedora/ramsey:Ideologyandchange 
info:fedora/ramsey:theshepherdofthepyrenees 
info:fedora/ramsey:ScenesinAmerica 
... 

Il mio obiettivo, è quello di poi prendere questi identificatori univoci e sostituire l'oggetto, <info:fedora/collection:ramsey>, dal query originale ed eseguire nuovamente la query.

sto immaginando uno scenario in cui avrei identificare un elemento radice nella query iniziale, ho i risultati restituire tutti gli oggetti membri, per poi tornare tutti oggetti membro quei degli oggetti, all'infinito ...

Ciò è possibile con le query Sparql? In particolare, credo che sto interrogando un database Mulgara RDF. Qualsiasi pensiero, anche se non è fattibile, è stato molto apprezzato.

+0

@ghkill Ho modificato il titolo per dare un riassunto migliore di cosa si tratta. –

risposta

8

Supponiamo che sia necessario attenersi a SPARQL 1.0. Credo che Mulgara abbia un supporto limitato per SPARQL 1.1, se ce ne sono.

Con SPARQL 1.0 se probabilmente sapete quanti livelli si desidera eseguire una query si possono fare cose come:

SELECT ?y WHERE { 
     ?x <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey> 
     ?y <fedora-rels-ext:isMemberOfCollection> ?x 
} 

Qui ?y sarà legato con elementi di livello 2 ° da root. Con UNIONS è possibile interrogare più livelli con una query. Un esempio per uno e due livelli di radice in una query:

SELECT ?x WHERE { 
    { 
     ?x <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey> . 
    } UNION { 
     ?zz <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey> 
     ?x <fedora-rels-ext:isMemberOfCollection> ?zz . 
    } 
} 

Il problema di questo è che non so davvero a quale livello ?x è legato. Pertanto non è possibile dipingere un albero con questo tipo di query. In SPARQL 1.1 questo viene risolto con BIND AS

SELECT ?x ?level WHERE { 
    { 
     ?x <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey> . 
     BIND (1 AS ?level) 
    } UNION { 
     ?zz <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey> 
     ?x <fedora-rels-ext:isMemberOfCollection> ?zz . 
     BIND (2 AS ?level) 
    } 
} 

Questa seconda query restituirà a quale livello ?x è vincolato. Puoi immaginare una query generata in modo programmatico con molti sindacati che cercano di raggiungere la profondità massima dell'albero. Se si desidera il pieno supporto per SPARQL 1.1 se si può provare a utilizzare Jena/ARQ. In Jena è anche possibile utilizzare Property paths e con qualcosa di simile a quanto segue:

SELECT ?x WHERE { 
    ?x <fedora-rels-ext:isMemberOfCollection>+ <info:fedora/collection:ramsey> . 
} 

si farebbe legatela in ?x tutti i nodi raggiungibili da <info:fedora/collection:ramsey> tramite il predicato <fedora-rels-ext:isMemberOfCollection>.

+1

Lei signore, sono un erudito e un gentiluomo, grazie mille. Questo è proprio quello che speravo di imparare, e mi dà molto da mangiare andando avanti. – ghukill