2011-04-25 5 views
5

मैं पाइथन कार्यान्वयन पर IN और NOT IN कथन (जो मैं सही ढंग से समझता हूं, SPARQL 1.1 में प्रस्तुत किया गया था) का उपयोग करने का प्रयास कर रहा हूं SPARQL का (अब rdfextras में) लेकिन ऐसा लगता है कि वाक्यविन्यास पहचाना नहीं गया है।दो ग्राफों के चौराहे को हटाने के लिए पायथन rdflib में SPARQL कथन में IN और नहीं चलाएं

चलो दो सेट (ए और बी) पर विचार करें। मैं उत्पादन क्या सेट ए में है करना चाहते हैं, को हटाने सेट बी में क्या है

SELECT ?title WHERE { 
    some logic defining ?item and ?SetB 
    FILTER (?item NOT IN ?SetB) 
} 

हो सकता है कि इस विशेष बात SPARQL 1.1 में जोड़ा गया था और rdfextra द्वारा समर्थित नहीं है, ऐसी स्थिति में मैं एक वैकल्पिक हल के लिए प्यार होता है (या NOT IN कीवर्ड का उपयोग किये बिना इसे कैसे करें)

उत्तर

4

मैंने एक समान क्वेरी की कोशिश की है और एक पार्सिंग अपवाद भी प्राप्त किया है। मैं rdflib's SPARQL parser कोड से गुजर चुका हूं और यह IN या NOT IN को संभालने के लिए एक नियम मौजूद नहीं प्रतीत होता है। मुझे लगता है कि यह कार्यक्षमता लागू नहीं की गई है।

वैसे भी, मुझे यकीन नहीं है कि आप इसे सही तरीके से उपयोग कर रहे हैं। SPARQL 1.1 spec में परिभाषा को देखने के बाद ... यह IN ऑपरेटर को अभिव्यक्तियों की सूची के विरुद्ध उपयोग करने के लिए परिभाषित करता है। इसलिए, आप कर चाहते हैं:

FILTER (?item NOT IN (?SetB))

और मैं पूरी तरह से यकीन है कि अगर आप दाएँ हाथ की ओर में चर का उपयोग कर सकते हैं नहीं कर रहा हूँ क्योंकि कल्पना उपयोग के संदर्भ में सभी उदाहरणों। संपादित: RobV संदेश दिखाई, यह

एक क्वेरी

एक संभव समाधान के साथ वैकल्पिक हल RLH में चर का उपयोग करने के लिए, कि काम हो सकता है आप का उपयोग करने के लिए है के लिए संभव है OPTIONAL और bound (दोनों में समर्थित rdflib)। कुछ ...

SELECT ?title WHERE { 
    some logic defining ?item 
    OPTIONAL { 
    some logic defining ?SetB 
    } 
    FILTER (bound(?SetB) && ?setB != ?item) 
} 

आपकी क्वेरी के बारे में अधिक जानने के बिना मैं इस मामले के साथ बेहतर सलाह नहीं दे सकता। दो प्रश्नों

सबसे आसान तरीका है के साथ

वैकल्पिक हल हल करने के लिए rdlib के साथ इस फिल्टर और दो प्रश्नों का उपयोग करने के लिए है, पहली क्वेरी ?SetB के लिए सभी posible मान प्राप्त करता है। दूसरे प्रश्न में चींटी आप गतिशील एक फ़िल्टर बनाएं:

SELECT ?title WHERE { 
    some logic defining ?item 
    FILTER (?item != <setb_val1> && ?item != <setb_val2> && 
    ... && ?item != <setb_val2>) 
} 
+0

बढ़िया यही वह है जिसे मैं ढूंढ रहा था। –

+0

आईएन/नोट इन अभिव्यक्ति के आरएचएस में चर का उपयोग करने के लिए कानूनी होना चाहिए, आरएचएस को 1.1 व्याकरण में 'अभिव्यक्ति सूची' कहा जाता है जो 'अभिव्यक्ति' प्रस्तुतियों यानी किसी वैध अभिव्यक्ति की किसी भी सूची की अनुमति देता है और इस प्रकार इसे चर शामिल हैं – RobV

+0

पता करने के लिए अच्छा, धन्यवाद रॉब। कल्पना में उदाहरण थोड़ा भ्रामक हैं। –

2

मुश्किल बारीकियों के बिना जवाब देने के लिए है, लेकिन यह लग रहा है जैसे आप चाहते MINUS:

SELECT ?title WHERE { 
    ?item ex:colour "red" .  # item is red 
    MINUS { ?item ex:size "big" } # but not in set of big things 
} 

:

SELECT ?title WHERE { 
    ?item ... ITEM CRITERIA ... 
    MINUS { ?item ... SET CRITERIA ... } 
} 
उदाहरण के लिए

NOT IN थोड़ा भ्रामक है: जहां तक ​​मैं कह सकता हूं कि यह एक सूची अभिव्यक्ति पर काम करता है, एक सूची नहीं जिसे आप परिभाषित कर सकते हैं।

+0

मुझे नहीं लगता कि 'MINUS' आरडीएफएलबी में लागू किया गया है, लेकिन अच्छी पकड़ है। –

+0

हां, 'MINUS' एक 1.1 फीचर है और इस प्रकार rdflib में लागू नहीं किया गया है। (लेकिन यह भी क्रूर समाधान है जो मैं भी आया था) –

संबंधित मुद्दे