2013-02-26 15 views
6

Próbuję utworzyć wykres RDF ze sklepu Mulgara RDF, używając zapytania Sparql do zwrócenia wyników. Po prostu zaczynam czuć się komfortowo z prostymi pytaniami, skutecznie pytając: "które przedmioty są członkami konkretnej kolekcji?"Zapytania rekursywne w języku SPARQL do przeglądania kolekcji kolekcji

Moje pytanie brzmi, i byłbym bardzo wdzięczny za wszelkie porady, czy mogę wziąć wyniki z tego prostego zapytania i przekierować je z powrotem jako przedmiot zapytania?

Na przykład mam ten sparql zapytanie:

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

Z tych wyników:

"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 
... 

Moim celem jest, aby następnie wziąć te unikalne identyfikatory i wymienić przedmiot, <info:fedora/collection:ramsey>, od oryginalne zapytanie i ponownie uruchom zapytanie.

Wyobrażam sobie scenariusz, w którym chciałbym zidentyfikować element główny w pierwotnym zapytaniu zostały wyniki zwrócić wszystkie obiekty członków, a następnie przywrócić wszystkie obiektów członków tych obiektu czy ad infinitum ...

Czy jest to możliwe w przypadku zapytań Sparql? W szczególności wydaje mi się, że szukam bazy danych Mulgara RDF. Wszelkie przemyślenia, nawet jeśli nie są możliwe do zrealizowania, są bardzo cenne.

+0

@ggill Redagowałem tytuł, aby dać lepsze podsumowanie tego, o co chodzi. –

Odpowiedz

8

Załóżmy, że musisz trzymać się SPARQL 1.0. Wierzę, że mulgara ma ograniczone wsparcie dla SPARQL 1.1, jeśli w ogóle.

Z SPARQL 1.0 jeśli pewnie wiesz ile poziomów chcesz kwerendy można robić takie rzeczy jak:

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

Tutaj ?y będzie związany z elementami 2. poziom z katalogu głównym. Dzięki UNION możesz wysyłać zapytania do wielu poziomów za pomocą jednego zapytania. Przykładem dla jednego i dwóch poziomach od nasady w jednym zapytaniu:

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 . 
    } 
} 

Problem z tym jest to, że naprawdę nie wiem na jakim poziomie ?x jest związany. Dlatego nie można namalować drzewa za pomocą tego typu zapytania. W SPARQL 1.1 to zostanie rozwiązane z 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) 
    } 
} 

Ten drugi zapytania powróci na jakim poziomie ?x jest związany. Możesz sobie wyobrazić programowo generowane zapytanie z wieloma związkami próbującymi osiągnąć maksymalną głębokość drzewa. Jeśli potrzebujesz pełnej obsługi SPARQL 1.1, możesz spróbować użyć Jena/ARQ. W Jenie można również użyć Property paths i czymś tak:

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

byłoby powiązać w ?x wszystkich węzłów osiągalny z <info:fedora/collection:ramsey> przez orzecznika <fedora-rels-ext:isMemberOfCollection>.

+1

Jesteś panem, jesteś uczonym i dżentelmenem, dziękuję bardzo. Właśnie tego chciałem się nauczyć i daje mi dużo żywności do przodu. – ghukill

Powiązane problemy