2014-09-01 23 views
5

Mam sparql-Query, który prosi o pewne właściwości URI danego typu. Ponieważ nie jestem pewien, czy te właściwości istnieje, używam opcjonalnego kluczowe:Alternatywa dla OPCJONALNYCH słów kluczowych w zapytaniach SPARQL?

PREFIX mbo: <http://creativeartefact.org/ontology/> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT * WHERE { 
    ?uri a mbo:LiveMusicEvent. 
    OPTIONAL {?uri rdfs:label ?label}. 
    OPTIONAL {?uri mbo:organisedBy ?organiser}. 
    OPTIONAL {?uri mbo:takesPlaceAt ?venue}. 
    OPTIONAL {?uri mbo:begin ?begin}. 
    OPTIONAL {?uri mbo:end ?end}. 
} 

Kiedy uruchomić tej kwerendy przed moim SPARQL punktu końcowego (Virtuoso Server), mam błąd:

Virtuoso 42000 Error The estimated execution time -721420288 (sec) exceeds the limit of 400 (sec).

Po zmniejszeniu klauzul OPTIONAL, po pierwszym usuniętym zdaniu szacowany czas wykonania wynosi 4106 sekund, po usunięciu dwóch klauzul kwerenda zostanie wykonana (i natychmiast zwróci wartości).

Nie widzę, dlaczego czas realizacji szacowany jest rakieta jak to z dodatkowymi klauzulami opcjonalne, ale może jestem po prostu za pomocą źle skonstruowane zapytanie?

Odpowiedz

6

DODATKOWE Wzory są zwykle kosztowne, określenia (w porównaniu z „normalną” join wzorów) dla silnika SPARQL. W tym przypadku błąd wskazuje, że planista zapytania wirtuoz szacuje zapytanie jest zbyt złożona, aby wykonać w wyznaczonym terminie (zauważ, że szacuje to - tak dokładna wartość może być źle).

Masz kilka alternatyw. Większość z nich wymaga jednak wykonania więcej niż jednego zapytania. Wspólny wzór to wzór „odzyskać i-iterate” - najpierw zrobić kwerendę, która pobiera wszystkie instancje mbo:LiveMusicEvent:

SELECT ?uri WHERE { ?uri a mbo:LiveMusicEvent } 

a następnie iteracyjne nad wynikiem i pobierać opcjonalne właściwości każdej instancji za:

SELECT * 
WHERE { VALUES(?uri) { <http://example.org/instance1> } 
     OPTIONAL {?uri rdfs:label ?label}. 
     OPTIONAL {?uri mbo:organisedBy ?organiser}. 
     OPTIONAL {?uri mbo:takesPlaceAt ?venue}. 
     OPTIONAL {?uri mbo:begin ?begin}. 
     OPTIONAL {?uri mbo:end ?end}. 
} 

Jak widać używam VALUES clause wstawić wyniki id instancji z pierwszego zapytania do drugiego zapytania. W tym przykładzie zakładam, że wykonujesz iterację jeden po drugim i dlatego robisz zapytanie dla każdej instancji, ale jako dalszą optymalizację możesz majstrować dodając więcej niż jedną instancję do klauzuli VALUES za jednym razem (oczywiście nie wszystkie z nich jednocześnie jednak, ponieważ sprawiłoby, że kwerenda byłaby tak samo złożony jak pierwotny).

Nawiasem mówiąc, VALUES jest SPARQL 1,1 cecha, a nie jestem pewien, że Virtuoso ją obsługuje. Jeśli nie, możesz osiągnąć ten sam efekt, używając klauzuli FILTER lub po prostu "ręcznie" zastępując wszystkie wystąpienia zmiennej ?uri identyfikatorem instancji dla każdej iteracji.

Innym sposobem radzenia sobie z nim jest najpierw wykonanie zapytania CONSTRUCT, które pobiera odpowiedni podzbiór danych z większego źródła, a następnie wykonanie bardziej złożonego zapytania z opcjami dla tego podzestawu. Np

CONSTRUCT 
WHERE { 
    ?uri a mbo:LiveMusicEvent; 
     ?p ?o . 
} 

pobiera dane o wszystkich przypadkach LiveMusicEvent jako wykres RDF. Umieść ten wykres w lokalnym modelu RDF (np. Model Sezamowy lub repozytorium w pamięci, jeśli pracujesz w Javie), i odszukaj go dalej.

+0

Jedną z rzeczy, które naprawdę chciałbym (ale nie mam pojęcia, ile to będzie kosztowne), jest możliwość zrobienia czegoś takiego jak 'from [skonstruować {...}, gdzie {...}] wybierz ... gdzie {...} '. Ułatwi to wykonanie niektórych trudnych zadań. –

+0

@JoshuaTaylor zawsze wydawało mi się to dziwne, że 'CONSTRUCT' (który w pewnym sensie jest bardziej" naturalnym "typem zapytań dla RDF) nie jest łatwe do połączenia/połączenia z innymi zapytaniami. Mamy podselekty - dlaczego nie podkonstrukcje?Sądzę, że to jedna z tych funkcji, w których WG po prostu poszedł "Może być miły, ale nie teraz". –

+0

Tak, byłoby miło mieć w przyszłości, faktycznie mamy implementację zapytań "CONSTRUCT" wewnętrznie w YarcData, ale nie w klauzuli "OD". Używamy ich jako sposobu na wywoływanie bardziej tradycyjnych analiz wykresów (np. K-średnich, najkrótszych ścieżek itp.), Używając ich jako pod-zapytań z zastosowanymi modyfikatorami, które mogą być prawidłowo zagnieżdżone wewnątrz regularnego wzorca graficznego. – RobV

Powiązane problemy