SPARQL

2009-11-19 21 views
9

में पूछे आइटम के लिए एक चर बाध्य करने के लिए कैसे इस सरल SPARQL क्वेरी में मैं जिसका वस्तु है विषयों की एक सूची प्राप्त 42SPARQL

SELECT ?v WHERE { ?v ?p 42 } 

अगर मैं जोड़ सकता हूँ? एक चर

SELECT ?v ?p WHERE { ?v ?p 42 } 
के रूप में पी

मुझे प्रति पंक्ति दो इकाइयां, विषय और भविष्यवाणी मिलेगी। क्या होगा यदि मैं तीन इकाइयों चाहता था, तो 42 सहित? कुछ ऐसा:

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

42 यदि वास्तव में है एक स्थिर, क्यों से आगे और पीछे? जब आप दो तत्वों के साथ पंक्तियां प्राप्त करते हैं, तो आप केवल तीसरे जोड़ सकते हैं। या यह उदाहरण oversimplified है और आप कुछ और जटिल करने की कोशिश कर रहे हैं? –

+1

बस जिज्ञासा। –

+0

@StefanoBorini SPARQL 1.0 ने इसे थोड़ा असुविधाजनक बना दिया, लेकिन SPARQL 1.1 में केवल इस उद्देश्य के लिए 'मान' शामिल है (और आप इनलाइन डेटा के लिए एक से अधिक स्थिर मान भी निर्दिष्ट कर सकते हैं)। मैंने एक जवाब जोड़ा है। –

उत्तर

6

मानक SPARQL 1.0 वास्तव में इसकी अनुमति नहीं देता है। हालांकि, ऐसा करने के लिए कुछ कार्यान्वयन-विशिष्ट एक्सटेंशन हो सकते हैं।

एक वर्कअराउंड के रूप में, यदि डेटा में ऑब्जेक्ट शाब्दिक के रूप में 42 के साथ ट्रिपल होता है, तो आप इसे कर सकते हैं उदा। इस तरह:

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

के रूप में आप एक ही विषय और अल्पविराम वस्तु सूची अंकन के साथ विधेय को बांटने ग्राफ पैटर्न लिख सकते हैं

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

साथ बराबर है जो, और WHERE कीवर्ड वैकल्पिक है।

दक्षता के लिए, आप छोटे ग्राफ पर काम करने वाले ट्रिपल को कम करने के लिए मूल ग्राफ पैटर्न का उपयोग करना चाहते हैं और केवल परिणामों को आगे बढ़ाने के लिए फ़िल्टर अभिव्यक्ति लागू करें।

+0

बस एहसास हुआ कि यह ठीक से काम नहीं करता है - इसका परिणाम किसी भी ट्रिपल का चयन करने में होता है जिसमें एक ही विषय होता है और ऑब्जेक्ट 42 के साथ अनुमान लगाया जाता है ताकि आप संभावित रूप से विविध ट्रिपल का भार प्राप्त कर सकें जो आपकी क्वेरी के लिए अप्रासंगिक हैं – RobV

+0

@RobV: True , यह बात बताने के लिए धन्यवाद। मैंने जवाब संशोधित कर दिया है। – laalto

+0

हाँ जो अब पूरी तरह से काम करता है – RobV

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

यह समझदार प्रतीत होता है लेकिन आपके ट्रिपल स्टोर और SPARQL इंजन के आधार पर यह बहुत अक्षम होने की संभावना है क्योंकि बहुत से SPARQL इंजन फ़िल्टर में इन-मेमोरी करते हैं जिसका अर्थ है कि आप प्रभावी रूप से पूरे डेटासेट को लोड करेंगे (क्योंकि ? वी? पी? एम सब कुछ मेल खाता है) और फिर उन सभी वस्तुओं के लिए फ़िल्टर करना है जो 42 – RobV

+0

सच हैं, लेकिन ट्रिपल स्टोर के आधार पर कोई भी SPARQL सुविधा अक्षम हो सकती है। उदाहरण के लिए, LIMIT और OFFSET समझदार चीजों की तरह प्रतीत होता है, इन्हें तेजी से काम करना चाहिए, है ना? उदाहरण के लिए एलेग्रोग्राफ पर ये पोस्टप्रोसेसिंग निर्देश हैं, यदि आपके पास बहुत सारे डेटा हैं तो बहुत धीमे हैं। फिल्टर के संबंध में, फ़िल्टर, कम से कम वर्चुसो पर यह बहुत ही कुशल है, यह केवल दो WHERE शर्तों के साथ बहुत ही सरल SQL क्वेरी में अनुवाद करता है। –

+0

इस तरह के एक साधारण फ़िल्टर के लिए यह एक साधारण एसक्यूएल क्वेरी में अनुवाद करेगा, यह मानते हुए कि आपका स्टोर एसक्यूएल आधारित है। एलआईटी और ऑफ़सेट आमतौर पर किसी भी SPARQL कार्यान्वयन में पोस्ट-प्रोसेसिंग होते हैं क्योंकि आपको उन्हें लागू करने से पहले फ़िल्टर और ऑर्डर बीईएस लागू करने की आवश्यकता होती है - मैं उनसे बड़े डेटासेट पर तेज़ी से होने की उम्मीद नहीं करता। ऐसे मामले के लिए वैसे भी लाल्टो का दृष्टिकोण अलग-अलग SPARQL कार्यान्वयन – RobV

0

मुझे पता है कि यह चारों ओर है, लेकिन मेरा मानना ​​है कि यह सबक्वायरी के साथ काम करने योग्य है।

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

वास्तव में, इसे और अधिक करने के लिए sparql 1.1 में जोड़ने का एक प्रस्ताव है। यदि यह कभी लागू हो जाता है, तो आप subquery के बजाय "BIND (42 AS? M)" का उपयोग करने में सक्षम होना चाहिए। http://www.w3.org/TR/sparql11-query/#bind –

+1

वास्तव में, ** मान ** फ़ॉर्म भी अच्छा है, और एकाधिक मानों का समर्थन करता है: 'मान? एम {42}? वी? पी? एम '। –

5

SPARQL 1.1 में, आप इस के लिए VALUES उपयोग कर सकते हैं:

यह मदद से आप संकीर्ण में क्वेरी पर काम करते हैं, इससे पहले कि आप अपने पूरे डाटासेट पर खुला छोड़ एक उपयोगी पैटर्न है। आप लिखते थे

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

एक और प्रकार BIND उपयोग करने के लिए है, उदा .:

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

BIND बयान बस एक बाध्यकारी कहते हैं? मीटर है, जो तब परिणाम सेट के लिए चुना जा सकता है के लिए।

+0

अंगूठे ऊपर - यह पायथन rdflib SPARQL कार्यान्वयन – lowtech

1

आप बाइंडिंग कीवर्ड का उपयोग फिल्टर के रूप में भी दो तरह से पूरा कर सकते हैं

का उपयोग बाइंडिंग

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

का उपयोग फ़िल्टर

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

में काम करता है ['VALUES' ने 'BINDINGS'' को प्रतिस्थापित और सामान्यीकृत किया है (https://www.w3.org/TR/2012/WD-sparql11-query-20120724/#status) SPARQL 1.1 क्वेरी भाषा के अंतिम कॉल वर्किंग ड्राफ्ट में –

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