2012-05-22 13 views
12

Jak można użyć funkcji zamiany w SPARQL 1.1, szczególnie w komendach aktualizacji?SPARQL 1.1: jak korzystać z funkcji zamiany?

Na przykład, jeśli mam kilka potrójnych? S? P? O gdzie? O jest ciągiem i dla wszystkich potrójnych gdzie? O zawiera ciąg "gotit" Chcę wstawić dodatkowy potrójny, gdzie "gotit" zastępuje się "hasit", jak mogłem to zrobić? Próbuję osiągnąć to jest Sesame 2.6.0.

Próbowałem to naiwne podejście:

INSERT { ?s ?p replace(?o,"gotit","haveit","i") . } 
WHERE { ?s ?p ?o . FILTER(regex(?o,"gotit","i")) } 

ale to spowodowało błąd składni.

ja też nie wykorzystywać wymienić na liście wyników kwerendy tak:

SELECT ?s ?p (replace(?o,"gotit","haveit","i") as ?r) WHERE { .... } 

Dokument SPARQL niestety nie zawiera przykład jak korzystać z tej funkcji.

Czy można w ogóle używać funkcji do tworzenia nowych wartości, a nie tylko do testowania istniejących wartości, a jeśli tak, to w jaki sposób?

Odpowiedz

14

Nie można użyć wyrażenia bezpośrednio w klauzuli INSERT, tak jak próbujesz to zrobić. Ponadto wiążę ?name z pierwszym potrójnym wzorcem, ale następnie filtruje się na ?o w FILTER, co nie daje żadnych wyników (filtrowanie zmiennej niezwiązanej da żadnych wyników dla większości wyrażeń filtru).

Zamiast tego trzeba użyć BIND w klauzuli WHERE aby nowa wersja wartości dostępne w klauzuli INSERT tak:

INSERT 
{ 
    ?s ?p ?o2 . 
} 
WHERE 
{ 
    ?s ?p ?o . 
    FILTER(REGEX(?o, "gotit", "i")) 
    BIND(REPLACE(?o, "gotit", "haveit", "i") AS ?o2) 
} 

BIND przypisuje wynik wyrażenia do nowej zmiennej tak możesz użyć tej wartości w innym miejscu zapytania/aktualizacji.

Istotna część specyfikacji SPARQL jesteś zainteresowany jest sekcja na Assignment

+0

Dziękuję za wskazanie błędu przy użyciu? Nazwa zamiast? O .. Próbowałem uprościć rzeczywiste zapytanie tutaj i zapomniałem zmienić nazwę? Na? O. Próbowałem kwerendy za pomocą BIND z moją instalacją SESAME, ale również daje mi błąd składni ... Będę musiał dowiedzieć się, czy jest to obsługiwane w najnowszej wersji! – Johsm

+0

Właśnie to przetestowałem i działa świetnie w wersji Sesame 2.6.5 z repozytorium OWLIM-Lite. – Johsm

5

Użycie numeru replace wygląda prawidłowo w sposób zgodny z spec. Wierzę, że REPLACE został niedawno dodany do ostatniego rev speca - być może Sesame go jeszcze nie obsługuje?

Jeśli po prostu wykonasz , czy zapytanie zwróci wiersze?

+0

Dziękuję za to pewność, że powinien on pracować jak sobie wyobrażałem! Zapytanie regex rzeczywiście działa dobrze. Opowiem o tym tutaj, gdy tylko uda mi się uaktualnić do nowszej wersji Sezamu. – Johsm

+0

Testowałem teraz z wersją Sesame 2.6.5 i okazało się, że podczas działania zapytania polecenie wstawiania nie działa i powoduje błąd składni. Podejście zaproponowane przez RobV poniżej za pomocą BIND działa z Sesame 2.6.5. – Johsm