2012-03-19 12 views
7

का उपयोग कर यह सही/सबसे अच्छा SPARQL क्वेरी rdf में आइटम की गणना प्राप्त करने के लिए है: सूची: (? COUNT (क) के रूप में गिनती)?हो रही गिनती: सूची SPARQL

चयन जहां {एक http://www.w3.org/1999/02/22-rdf-syntax-ns#first? सी}

आपकी मदद के लिए अग्रिम धन्यवाद।

संबंध है, राहुल

उत्तर

4

दिलचस्प सवाल, क्योंकि यह काफी आसान लगता है और फिर भी क्वेरी को सही ढंग से व्यक्त करना मुश्किल है। William Greenly's answer जो आप चाहते हैं उसे प्रदान नहीं करता है, हालांकि वह अपने स्पष्टीकरण में बिल्कुल सही है और सही ढंग से property path का उपयोग करें। सही प्रश्न पूछने में सक्षम होने के लिए जो आपके प्रश्न का उत्तर देता है, यह माना जाना चाहिए कि सभी सूचियां अच्छी तरह से बनाई गई हैं (उनके पास केवल एक पहला तत्व है, एक आराम है और वे एक शून्य के साथ समाप्त होते हैं)।

आपकी क्वेरी में समस्या यह है कि यह डेटासेट में सभी सूचियों के सभी सदस्यों की गणना करेगा। rdf:first को केवल एक सूची के तत्व से संबंधित करने के लिए आपको कुछ चाहिए।

आप एक यूआरआई सूची अपने में रुचि रखते हैं की पहचान है, तो आप निम्न कर सकते हैं:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX ex: <http://www.example.org/#> 
SELECT (COUNT(?member) AS ?count) 
WHERE { 
    ex:uriOfTheList rdf:rest*/rdf:first ?member 
} 

लेकिन अक्सर, सूचियों यूआरआई से पहचान नहीं हो। इस मामले में, अन्य गुणों का उपयोग करके कुछ सूचियों की पहचान करना संभव है। उदाहरण के लिए, मान लें कि एक ex:listOfAuthors संपत्ति है, तो आप कर सकते हैं:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX ex: <http://www.example.org/#> 
SELECT (COUNT(?member) AS ?count) 
WHERE { 
    ex:publication ex:listOfAuthors ?list . 
    ?list rdf:rest*/rdf:first ?member . 
} 

नोट अगर आप बस करना है कि:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT (COUNT(?member) AS ?count) 
WHERE { 
    ?list rdf:rest*/rdf:first ?member . 
} 

आप सूचियों और उप-सूचियों के सभी आकारों के ऊपर जोड़ देंगे। अब चीजें जटिल हो जाती हैं यदि आपने भविष्यवाणी नहीं की है कि आप सूची संलग्न कर सकते हैं और आपके पास यूआरआई नहीं है और शायद आप सभी सूचियों के लिए गिनती प्राप्त करना चाहते हैं।

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT (COUNT(?c) AS ?count) 
WHERE { 
    ?thing !rdf:rest ?list . 
    ?list rdf:rest*/rdf:first ?member . 
} 

क्या यह कह रहा है कि हम कुछ एक सूची से कनेक्ट होता है पता लगाना चाहते है, लेकिन विधेय rdf:rest साथ नहीं: वहाँ एक तरीका है कि काम करना चाहिए है। सिद्धांत रूप में, केवल किसी सूची की शुरुआत किसी अन्य इकाई के लिए एक अनुमान के माध्यम से जुड़ी होती है, अगर इकाई स्वयं सूची नहीं है और अनुमान rdf:rest नहीं है। इसके अलावा, सूचियों को आम तौर पर किसी अन्य तरह से अन्य संस्थाओं से जोड़ा जाता है, क्योंकि किसी और चीज से स्वतंत्र रूप से सूची का वर्णन करने में कोई बात नहीं होगी।

+0

धन्यवाद एंटोनी, आपने किसी चीज़ से जुड़ा हुआ सूची का एक बहुत ही महत्वपूर्ण बिंदु पहचाना है। मैंने इसके बारे में तब नहीं सोचा जब मैंने डेटासेट पर क्वेरी की कोशिश की जिसमें केवल एक सूची थी। – user1278577

3

यह वास्तव में एक बहुत अच्छा सवाल है, क्योंकि इसके नहीं एक विशेष रूप से सीधा समाधान।

RDF सूचियों में महत्वपूर्ण शब्द हैं:

rdf:first 
rdf:rest 
rdf:nil 

एक से अधिक मदों की एक सूची के लिए, यह अनुशंसित है कि आप मॉडल इस प्रकार है:

a:a rdf:first a:b; 
    rdf:rest [ 
     rdf:first a:c; 
     rdf:rest rdf:nil. 
    ]. 

का उपयोग कर rdf: इंगित करने के लिए नहीं के बराबर कि एक सूची में अब और कोई आइटम नहीं है (इसलिए अनिवार्य रूप से यह सूचियों की एक सूची है)। लेकिन यह भी कहा गया है कि आप rdf उपयोग कर सकते हैं: इस प्रकार पहले interderterminantly:

a:a rdf:first a:b; 
    rdf:first a:c; 
    rdf:rest rdf:nil. 

rdf के बिंदु: शून्य है कि एक सूची अब कोई आइटम नहीं है निर्दिष्ट करने के लिए है। याद रखें कि सेमेन्टिक वेब ओपन वर्ल्ड धारणाओं पर आधारित है, इसलिए जब तक कि अन्य ने कहा न हो, आप यह नहीं मान सकते कि सूची में कोई और आइटम नहीं है क्योंकि वे ज्ञात नहीं हैं या बताए गए हैं, इसलिए व्यक्ति की आवश्यकता, rdf: nil।

सौभाग्य से, उपरोक्त उदाहरण में, दोनों के लिए एक ही प्रश्न है, जो SPARQL 1.1 का समर्थन करने वाले प्रोसेसर पर निर्भर करता है।

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT (COUNT(?a) AS ?count) 
WHERE {?a rdf:first+ ?c} 

याद रखें कि जब तक सूची में rdf शामिल नहीं है: शून्य, इसे पूर्ण होने के लिए न मानें।

+0

विलियम धन्यवाद। – user1278577

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