2009-11-19 5 views
9

W tej prostej kwerendy sparql uzyskać listę przedmiotów, których celem jest 42Jak powiązać zmienną do odpytywany pozycji w SPARQL

SELECT ?v WHERE { ?v ?p 42 } 

Jeśli dodać? P jako zmiennej

SELECT ?v ?p WHERE { ?v ?p 42 } 

Otrzymam dwie jednostki w wierszu, temat i predykat. Co jeśli chciałbym trzech podmiotów, w tym 42? Coś takiego jak:

SELECT ?v ?p ?m WHERE { ?v ?p (42 as m) } 
+1

Jeśli 42 jest naprawdę stała, dlaczego se czy to w przód iw tył? Kiedy otrzymasz wiersze z dwoma elementami, możesz po prostu dodać trzeci. Czy ten przykład jest zbyt uproszczony i próbujesz zrobić coś bardziej skomplikowanego? –

+1

Po prostu ciekawość. –

+0

@StefanoBorini SPARQL 1.0 uczynił to trochę niewygodnym, ale SPARQL 1.1 zawiera "wartości" tylko do tego celu (i możesz określić więcej niż jedną stałą wartość dla danych wbudowanych). Dodałem odpowiedź. –

Odpowiedz

6

Standardowy SPARQL 1.0 na to nie pozwala. Jednak mogą to być pewne rozszerzenia implementacyjne.

W celu obejścia tego problemu, jeśli dane zawierają potrójny znak 42, jako obiektowy, można to zrobić np. tak:

SELECT ?v ?p ?m { ?v ?p 42, ?m FILTER(?m=42)} 

co jest równoznaczne z

SELECT ?v ?p ?m WHERE { ?v ?p 42 . ?v ?p ?m FILTER(?m=42)} 

jak można pisać wzory wykresu dzielące ten sam podmiot i orzecznik z listy notacji obiektu przecinek, a słowo kluczowe WHERE jest opcjonalne.

Aby uzyskać wydajność, należy użyć podstawowych wzorów wykresu, aby zmniejszyć potrójną pracę do mniejszego zestawu, a dopiero potem zastosować wyrażenia FILTER w celu dalszego przycinania wyników.

+0

Po prostu zdałem sobie sprawę, że to nie działa poprawnie - to powoduje wybranie dowolnego Triples, które mają ten sam temat i predykat jak te z obiektem 42, więc potencjalnie dostaniesz ładunek różnych trójek, które są nieistotne dla twojego zapytania – RobV

+0

@RobV: True , dziękuję za wskazanie tego. Zrewidowałem odpowiedź. – laalto

+0

Tak, to działa teraz idealnie – RobV

1
select ?v ?p ?m where { ?v ?p ?m . FILTER(?m = 42) } 
+1

Wydawałoby się to rozsądne, ale w zależności od twojego Triple Store i silnika SPARQL prawdopodobnie będzie to bardzo nieefektywne, ponieważ wiele silników SPARQL robi FILTERy w pamięci, co oznacza, że ​​możesz skutecznie załadować cały zestaw danych (ponieważ ? v? p? m pasuje do wszystkiego), a następnie musi FILTER nad wszystkimi obiektami, które są 42 – RobV

+0

Prawda, ale każda funkcja SPARQL może być nieskuteczna w zależności od składnicy potrójnej. Na przykład LIMIT i OFFSET wydają się sensownymi rzeczami, powinny działać szybko, prawda? Na przykład na AllegroGraph są to instrukcje postprocessingu, więc bardzo powolne, jeśli masz dużo danych. W odniesieniu do filtra, FILTER, przynajmniej na Virtuoso jest bardzo wydajny, przekłada się na bardzo proste zapytanie SQL z tylko dwoma warunkami WHERE. –

+0

Dla prostego FILTRA w ten sposób przełożyłoby się na proste zapytanie SQL, zakładając, że twój sklep jest oparty na SQL. LIMIT i OFFSET są zwykle przetwarzane w dowolnej implementacji SPARQL, ponieważ musisz zastosować filtry i ORDER BY, zanim będziesz mógł je zastosować - nie oczekiwałbym, że będą szybkie w dużych zbiorach danych. W takim przypadku i tak podejście laalto jest bardziej wydajne i bardziej przenośne w różnych implementacjach SPARQL – RobV

0

wiem, że to o okrągłym, ale wierzę, że jest to wykonalne z podzapytania.

Jest to użyteczny wzór, aby pomóc Ci pracować na zapytania w wąskim, zanim go luzem na całym zbiorze:

SELECT ?v ?p ?m WHERE { 
    { SELECT 42 as ?m WHERE { } } 
    ?v ?p ?m . 
} 
+2

W rzeczywistości istnieje propozycja dodania do Sparql 1.1, aby zrobić to bardziej bezpośrednio. Jeśli to kiedykolwiek zostanie zaimplementowane, powinieneś być w stanie użyć "BIND (42 AS? M)" zamiast podzapytania. http://www.w3.org/TR/sparql11-query/#bind –

+1

W rzeczywistości, ** values ​​** jest jeszcze ładniejsza i obsługuje wiele wartości: 'values? m {42}? v? p? m '. –

5

W SPARQL 1.1, można użyć VALUES do tego. Można by napisać

SELECT ?v ?p ?m WHERE { 
    values ?m { 42 } 
    ?v ?p ?m 
} 
8

Innym wariantem jest wykorzystanie powiązań, np .:

SELECT ?v ?p ?m 
WHERE { 
    BIND(42 AS ?m) 
    ?v ?p ?m 
} 

Oświadczenie BIND prostu dodaje wiążące dla? m, które następnie mogą być wybrane do zbioru wynikowego.

+0

thumb up - działa w python rdflib Implementacja SPARQL – lowtech

1

można wykonać na dwa sposoby: z wykorzystaniem Wiązania słowa kluczowego, jak również jako filtr

Korzystanie WIĄZANIA

SELECT ?v ?p ?m 
WHERE { ?v ?p ?m} 
BINDINGS ?m {(42)} 

Korzystanie FILTR

SELECT ?v ?p ?m 
WHERE { 
?v ?p ?m 
FILTER (?m = 42) 
} 
+0

['VALUES' zastąpił i uogólnił' BINDINGS'] (https://www.w3.org/TR/2012/WD-sparql11-query-20120724/#status) w Projekcie roboczym ostatniego wywołania języka zapytań SPARQL 1.1 –