2009-10-23 23 views
10

मैं एक SPARQL क्वेरी लिखने की कोशिश कर रहा हूं जो मुझे foaf:Agents देना चाहिए जो foaf:Persons नहीं है।SPARQL नकारात्मक: सभी foaf: एजेंट जो foaf नहीं हैं: व्यक्ति

मैं इस समस्या के लिए this OPTIONAL/BOUND construct लागू करने का कोई तरीका नहीं देख सकता, क्योंकि rdfs:subClassOf और rdf:type जैसी सभी संपत्तियां संक्रमणीय और प्रतिबिंबित हैं।

मैंने कोशिश की यह:

SELECT * WHERE { 
?x rdf:type foaf:Agent 
OPTIONAL { ?y rdf:type foaf:Person } 
FILTER (!BOUND(?y)) } 

लेकिन rdf: प्रकार कम से कम जेना/ARQ/SDB साथ, सकर्मक हो रहा है।

उत्तर

10

कारण यह काम नहीं कर रहा है क्योंकि आपके पास दो अलग परिवर्तनीय बाइंडिंग हैं (?x और ?y) जो आपकी क्वेरी में असंबंधित हैं। तो ?x परिणाम सेट (जो आप चाहते हैं) में दिखाई देने के लिए बाध्य होना चाहिए, लेकिन यदि ?y अनबाउंड है, तो आपने ?x के बारे में कुछ नया नहीं सीखा है।

अद्यतन: एक आदर्श प्रश्न में, ?y पर कोई आवश्यकता नहीं होगी; आप सीधे ?x के इनकमिंग/आउटगोइंग एजग का परीक्षण कर सकते हैं। यह SPARQL 1.0 में करना मुश्किल है (असंभव?) जब आप यह जांचना चाहते हैं कि किसी दिए गए चर बाध्यकारी पर कोई किनारा मौजूद नहीं है या नहीं।

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 

SELECT ?agent 
WHERE 
{ 
    ?agent rdf:type foaf:Agent . 
    NOT EXISTS { ?agent rdf:type foaf:Person . } 
} 

@Kingsley Idehen का दृष्टिकोण (तृतीय-पक्ष SPARQL एक्सटेंशन का उपयोग कर) आप कम समय में समस्या का समाधान की मदद करनी चाहिए: हालांकि, SPARQL 1.1 निषेध के लिए सहायता प्रदान करेगा। सत्यापन के लिए

+0

लेकिन यह कैसे मैं के बीच x और y एक रिश्ता स्थापित करूँ??? –

+0

SPARQL 1.1 निश्चित रूप से अस्वीकार करने जा रहा है, आईएसडब्ल्यूसी 200 9 में कार्यकारी समूह पैनल उस – RobV

+0

पर स्पष्ट था नोट करें कि SPARQL 1.1 वाक्यविन्यास (जैसा कि लिंक में निर्दिष्ट है) वास्तव में 'फ़िल्टर नहीं है' वास्तव में है ('फ़िल्टर' कीवर्ड की आवश्यकता है सामने) –

1

वाया गुणी SPARQL एक्सटेंशन endpoint http://lod.openlinksw.com/sparql (LOD बादल कैश उदाहरण)

अलग चयन एक्स ओ

जहाँ {

x एक foaf?? एजेंट। ? एक्स? पी? ओ। फिल्टर (BIF: मौजूद है ((चयन (1) जहां {Xa foaf: व्यक्ति})))

}

सीमा 10

वर्णन एक्स

जहाँ {

?

? Xa foaf: एजेंट।

फिल्टर (BIF: मौजूद है ((चुनिंदा (1) जहां {Xa foaf: व्यक्ति}))) }

सीमा 200

8

SPARQL 1.0 में ऐसा करने के लिए, आप होगा ऐसा करने के लिए:

SELECT * WHERE { 
    ?x rdf:type foaf:Agent 
    OPTIONAL { ?y rdf:type foaf:Person . FILTER (?x = ?y) . } 
    FILTER (!BOUND(?y)) 
} 

फिल एम कहते हैं, SPARQL 1.1 नई वाक्य रचना परिचय इतना अधिक सरल लिखने के लिए बनाने के लिए होगा।

ली

+0

आपके समाधान ने मेरा दिन बचाया !!! धन्यवाद! –