2013-03-10 5 views
9

एक ठेठ SPARQL क्वेरी कि निर्दिष्ट करता है एक ग्राफ इस प्रकार दिखाई देंगे:दो ग्राफ के खिलाफ एक sparql क्वेरी चलाते हैं?

SELECT ?b ?c WHERE { GRAPH <http://AliceIRI> { 
<http://local.virt/foo> ?b ?c}} 

यह मैं AliceIRI में सभी ट्रिपल बता देंगे जहां "foo" एक विषय है। क्या होगा यदि मैं दो अलग अलग रेखांकन में देखना चाहते हैं, एक संघ करने के लिए मेरी एकमात्र विकल्प है:

SELECT ?b ?c WHERE {{ GRAPH <http://AliceIRI> { 
<http://local.virt/foo> ?b ?c}} 
UNION 
{ GRAPH <http://BobIRI> { 
<http://local.virt/foo> ?b ?c}}} 

या वहां कुछ इस तरह कुछ आशुलिपि है कि मुझे इस अधिक आसानी से लिखने के लिए अनुमति होगी है,:

SELECT ?b ?c WHERE { GRAPH <http://AliceIRI> + <http://BobIRI> { 
<http://local.virt/foo> ?b ?c} 

बीटीडब्ल्यू मैं Virtuoso 6.01.3127 पर हूँ।

SELECT ?b ?c WHERE { GRAPH <http://AliceIRI> + <http://BobIRI> { 
<http://local.virt/foo> ?b ?c . 
<http://local.virt/bar> ?b ?c}} 

और इस मैच ?b और ?c ऐसी है कि <http://local.virt/foo> ?b ?c<http://AliceIRI> में है और <http://local.virt/bar> ?b ?c में है:

अद्यतन 1

स्पष्ट करने के लिए, मैं वास्तव में चलाने के लिए सक्षम होना चाहते हैं <http://BobIRI>। बस <http://AliceIRI> (अकेले) और <http://BobIRI> (अकेले) में मैचों का संघ लेना इसे पूरा नहीं करेगा।

और आगे स्पष्ट करने के लिए: मुझे एहसास हुआ है कि अगर कम महत्वपूर्ण चीज़ें सभी ऐलिस के थे और बार सब बॉब के थे, तो मैं

SELECT ?b ?c WHERE { 
GRAPH <http://AliceIRI> { 
<http://local.virt/foo> ?b ?c } . 
GRAPH <http://BobIRI> { 
<http://local.virt/bar> ?b ?c}} 

लिख सकता है (जो वास्तव में है क्या मैं अपने आवेदन के लिए आवश्यक) - लेकिन कम से कम "अकादमिक हित" के लिए सवाल है कि ग्राफ़ों के संघ के खिलाफ एक क्वेरी चलाने के लिए एक वाक्य रचनात्मक रूप से अच्छा तरीका है (जैसा कि कई ग्राफों के विपरीत है और फिर परिणामों को संघबद्ध करता है) अभी भी खड़ा है।

उत्तर

7

हाँ

SELECT ?b ?c 
FROM NAMED <http://AliceIRI> 
FROM NAMED <http://BobIri> 
WHERE 
{ 
    GRAPH ?g { <http://local.virt/foo> ?b ?c } 
} 

FROM NAMED खंड जब आप एक GRAPH ?var खंड का उपयोग नामित रेखांकन कि पूछे रहे हैं स्थापित करने के लिए इस्तेमाल किया जा सकता है।

यह ध्यान रखें कि अर्थ की दृष्टि से इस क्वेरी जो आपके द्वारा अब पैटर्न GRAPH खंड द्वारा व्यक्त की प्रत्येक नामित ग्राफ के खिलाफ अलग से मिलान किया जाता है इसके बाद के संस्करण में लिखा था के समान है और एक साथ

unioned संपादित

करने के लिए महत्वपूर्ण है FROM NAMED के बजाय FROM का उपयोग करने के लिए यदि आप FROM का उपयोग करते हैं, तो आप FROM क्लॉज में सभी ग्राफों के विलय होने के लिए डिफ़ॉल्ट ग्राफ सेट करते हैं और आपको GRAPH उदाहरणों का उपयोग करने की आवश्यकता नहीं है।

SELECT ?b ?c 
FROM <http://AliceIRI> 
FROM <http://BobIri> 
WHERE 
{ 
    <http://local.virt/foo> ?b ?c 
} 

इस मामले में जहां ट्रिपल कि ट्रिपल पैटर्न रेखांकन में नामित किया है में से किसी से आते हैं के विभिन्न भागों से मेल अनुमति देना चाहते हैं को शामिल किया गया।

ध्यान दें कि कुछ ट्रिपल स्टोर आपको सेट अप करने की अनुमति दे सकते हैं ताकि डिफ़ॉल्ट ग्राफ को स्वचालित रूप से सभी नामित ग्राफों के विलय के रूप में माना जा सके।

+1

रेखांकन भर में परिणाम है, बल्कि ट्रिपल पैटर्न विभिन्न रेखांकन में ट्रिपल से खींचा जा करने के लिए अनुमति की तुलना में है, तो यह एक कुंद साधन का एक सा है, तो यह सिर्फ यूनियनों। क्या आप यह स्पष्ट कर सकते हैं कि यह एकमात्र साधन उपलब्ध है (ऊपर अपडेट 1 देखें)। –

+1

@ जो कॉर्नेलि मैंने अपना जवाब अपडेट किया है, हां आप इसे थोड़ा अलग प्रश्न – RobV

+0

अद्भुत के साथ कर सकते हैं, इसके अलावा धन्यवाद। –

1

यदि आपको उपयोग किए जा रहे ग्राफ के सबसेट में कोई क्वेरी चलाने की आवश्यकता है तो आप ग्राफ के आईआरआई पर एक फ़िल्टर भी सेट कर सकते हैं।

जैसे:

SELECT ?b ?c 
FROM NAMED <http://AliceIRI> 
FROM NAMED <http://BobIri> 
FROM NAMED <http://CarlIri> 
WHERE { 
GRAPH ?g { 
    <http://local.virt/foo> ?b ?c 
    FILTER(?g=<http://AliceIRI> || ?g=<http://BobIri>) 
} 
} 
संबंधित मुद्दे