2013-09-03 5 views
6

के बीच अंतर की गणना करना दो SPARQL xsd: dateTime के बीच अंतर की गणना करने के लिए फ़ंक्शन क्या है?SPARQL दो दिनांक

मुझे डेटीफ का संदर्भ मिला है, लेकिन यह काम नहीं कर रहा है। क्या ऐसा अंतर्निहित फ़ंक्शन SPARQL में मौजूद है क्योंकि यह अधिकांश अन्य क्वेरी भाषाओं के साथ करता है?

+0

क्या आपने इस प्रश्न को पहले अज्ञात उपयोगकर्ता के रूप में पूछा था और फिर इसे हटा दिया था? मैंने शपथ ली थी कि मैंने आज पहले लगभग एक समान सवाल का जवाब दिया था। –

+0

@ जोशुआ टेलर मैंने एक प्रश्न पूछा था, लेकिन वह इसका हिस्सा था और वास्तव में यह सवाल नहीं था। दो प्रश्न अलग हैं और मैंने इसे हटाया नहीं है। –

+1

ठीक है, सिर्फ उत्सुक है, क्योंकि xsd के घटाव के बारे में कोई प्रश्न था: तिथियां, और तथ्य यह है कि वे एक अवधि का उत्पादन करते हैं, और इसके बजाय वर्षों की संख्या कैसे प्राप्त करें। यही कारण है कि मेरे पास SPARQL कोड जाने के लिए तैयार था। बस एक अजीब संयोग, शायद। –

उत्तर

8

कुछ SPARQL इंजन सीधे अंकगणित दिनांक का समर्थन कर सकते हैं। उदाहरण के लिए, this answers.semanticweb.com question and answer में उल्लेख के रूप में, जेना दिनांक अंकगणित का समर्थन करता है, और आप एक तारीख को दूसरे से घटा सकते हैं और एक xsd प्राप्त कर सकते हैं: अवधि। अन्य कार्यान्वयन एक datediff समारोह का समर्थन कर सकते हैं। उदाहरण के लिए, this Virtuoso example में bif: datediff का उपयोग शामिल है। हालांकि, ये एक्सटेंशन हैं और किसी भी विशेष SPARQL कार्यान्वयन में उपस्थित होने की गारंटी नहीं है।

अधिक पोर्टेबल के लिए, संभवतः कम कुशल समाधान के लिए, आप year का उपयोग डेटाटाइम से वर्ष के हिस्सों को निकालने के लिए कर सकते हैं। यह, उदाहरण के लिए करते हैं, की सुविधा देता है

select ?age where { 
    bind("1799-12-14"^^<http://www.w3.org/2001/XMLSchema#date> as ?death) 
    bind("1732-02-22"^^<http://www.w3.org/2001/XMLSchema#date> as ?birth) 
    bind(year(?death)-year(?birth) as ?age) 
} 

और परिणाम प्राप्त

------- 
| age | 
======= 
| 67 | 
------- 

यह संभावित महीने और दो तिथियों के दिनों के आधार पर, एक एक करके बंद हो गया है, लेकिन आप इसी तरह से कर सकते हैं month और day फ़ंक्शंस का उपयोग करके इसके आसपास काम करें। This thread उस तरह के कार्यान्वयन के कुछ वर्णन करता है।

+0

लिंक मर चुका है, कृपया अपडेट करें। –

+0

@ KimA.Jakobsen वहाँ कई लिंक हैं, लेकिन मुझे लगता है कि आप पहले का मतलब है। Answer.semanticweb.com साइट कभी-कभी थोड़ा सा फ्लेकी होती है। मुझे उम्मीद है कि यह बहुत लंबे समय से पहले वापस आ जाएगा। उस ने कहा, इंटरनेट आर्काइव/वेकबैक मशीन की एक प्रति है https://web.archive.org/web/20131026044936/http://answers.semanticweb.com/questions/24017/jena-arq-date-diff पर। –

+0

ठीक है, शायद तेज़ हो सकता है, मैं घर जल्द ही वापस आऊंगा। संग्रह पृष्ठ के लिए धन्यवाद :) –

6

मुझे यह पोस्ट तब मिला जब मैं खोज रहा था कि SPARQL में उम्र की गणना कैसे करें। सही संकेत देने के लिए जोशुआ टेलर का धन्यवाद। हालांकि मैंने समायोजन जोड़कर कोड सेगमेंट में सुधार किया है, इसलिए यदि एक व्यक्ति ने अपनी मृत्यु के वर्ष में अपना जन्मदिन नहीं लिया है तो यह एक साल तक बंद नहीं है। मैंने सोचा कि यह कुछ लोगों के लिए उपयोगी हो सकता है, जो इस विषय को खोजते समय इस पोस्ट को ढूंढते हैं, जैसा कि मैंने किया था .:

select ?age where { 
    bind("1799-12-14"^^<http://www.w3.org/2001/XMLSchema#date> as ?death) 
    bind("1732-02-22"^^<http://www.w3.org/2001/XMLSchema#date> as ?birth) 
    bind(year(?death) - year(?birth) - if(month(?death)<month(?birth) || (month(?death)=month(?birth) && day(?death)<day(?birth)),1,0) as ?age) 
} 
+0

अविश्वसनीय रूप से उपयोगी! अद्यतन करने के लिए धन्यवाद। –