2011-08-17 11 views
20

Potrzebuję trochę pomocy przy wyborze odpowiedniego trójek z mojego sklepu ....wybieranie za pomocą sparql oparciu o „potrójnym nie istnieje”

<a> a <type/1> . 
<b> a <type/1> . 
<c> a <type/1> . 
<c> a <type/2> . 

Chcę wybrać tylko te elementy, które mają typ/1 i nie type/2

Jaki jest najlepszy sposób osiągnięcia tego przy pomocy kwerendy sparql select?

szukam omething jak:

select ?a where 
{ 
    ?a a <type/1> . 
    !{ ?a a <type/2> } 
} 

Dzięki,

:)

Odpowiedz

23

Alternatywny SPARQL 1,1 rozwiązaniem jest użycie MINUS np

SELECT ?a 
WHERE 
{ 
    ?a a <type/1> . 
    MINUS { ?a a <type/2> . } 
} 

MINUS odejmuje rozwiązań, które odpowiadają jego potrójne wzór z dotychczasowych meczów.

W większości przypadków za pomocą FILTER NOT EXISTS { } i MINUS { } są równoważne, ale uwaga istnieją pewne przypadki rogu, gdzie nie jest to prawdą - patrz SPARQL 1.1 specification dla niektórych przykładów.

12

W SPARQL 1.0 to trochę skomplikowane:

SELECT ?a WHERE { 
    ?a a <type/1>. 
    OPTIONAL { 
     ?a a ?othertype . 
     FILTER (?othertype = <type/2>) 
    } 
    FILTER (!BOUND(?othertype)) 
} 

Klauzula OPTIONAL wiąże ?othertype dla dowolny ?a o numerze <type/2> i pozostawia je niezwiązane dla żadnego ?a, który go nie ma.

Ostateczny FILTER następnie wybiera tylko te wiersze, w których ?a pozostało niezwiązane.

W SPARQL 1,1 jest znacznie prościej

SELECT ?a WHERE { 
    ?a a <type/1>. 
    FILTER NOT EXISTS { ?a a <type/2> . } 
} 
+0

zmieniłeś sparql 1.1 przykład do korzystania wyraźny URI w 'NIE EXISTS' jak przy użyciu zmiennej również dopasować' ' trójek pierwszy wzorzec znaleziony i spowodować odfiltrowanie wszystkich rozwiązań – RobV

+0

Dzięki za to RobV! – cygri

Powiązane problemy