2011-08-17 14 views
20

मैं एक छोटे से मेरी दुकान से सही ट्रिपल का चयन मदद की ज़रूरत है ....के आधार पर SPARQL का उपयोग कर चयन 'ट्रिपल मौजूद नहीं है'

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

मैं केवल तत्व है जो प्रकार/1 और नहीं कर रहे हैं का चयन करना चाहते टाइप/2

स्पैर्कल चयन क्वेरी का उपयोग करके इसे प्राप्त करने का सबसे अच्छा तरीका क्या है?

तरह omething रहा हूँ:

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

धन्यवाद,

:)

उत्तर

23

एक वैकल्पिक SPARQL 1.1 समाधान है MINUS उदा उपयोग करने के लिए

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

MINUS समाधान है कि मौजूदा मैचों में अपनी ट्रिपल आकार से मिलान घटा देती है।

FILTER NOT EXISTS { } और MINUS { } का उपयोग कर अधिकांश मामलों में समकक्ष हैं लेकिन सावधान रहें कि कुछ कोने के मामले हैं जहां यह सत्य नहीं है - इस के कुछ उदाहरणों के लिए SPARQL 1.1 specification देखें।

12

SPARQL 1.0 में थोड़ा मुश्किल है कि:

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

OPTIONAL खंड के लिए ?othertype बांधता कोई ?a जिसमेंहै, और इसे किसी भी ?a के लिए अनबाउंड छोड़ देता है जिसमें यह नहीं है।

अंतिम FILTER तब केवल उन पंक्तियों का चयन करता है जहां ?a अनबाउंड छोड़ दिया गया था।

SPARQL 1.1 में यह बहुत आसान है:

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

एक चर का उपयोग करने के रूप में 'EXISTS' में स्पष्ट यूआरआई में स्पष्ट यूआरआई का उपयोग करने के लिए अपने SPARQL 1.1 उदाहरण को बदल दिया गया है, '' मिलान करने वाले पहले पैटर्न को ट्रिपल करता है और परिणामस्वरूप सभी समाधानों को फ़िल्टर करने में परिणाम – RobV

+0

उस रोब के लिए धन्यवाद! – cygri