2013-09-03 74 views
6

Chức năng tính toán sự khác biệt giữa hai SPARQL xsd: dateTime là gì?SPARQL Tính khác biệt giữa hai ngày

Tôi đã tìm thấy tham chiếu đến dateiff, nhưng điều này không hoạt động. Có như vậy được xây dựng trong chức năng tồn tại trong SPARQL như nó không với hầu hết các ngôn ngữ truy vấn khác?

+0

Bạn có hỏi câu hỏi này trước đó là người dùng ẩn danh và sau đó xóa nó? Tôi có thể thề rằng hôm qua tôi đã trả lời một câu hỏi gần như giống hệt nhau. –

+0

@JoshuaTaylor Tôi đã đặt câu hỏi, nhưng đó là một phần của nó và không chính xác câu hỏi này. Hai câu hỏi khác nhau và tôi đã không xóa nó. –

+1

Ok, chỉ tò mò, bởi vì có một câu hỏi về trừ của xsd: ngày, và thực tế là họ sản xuất một thời gian, và làm thế nào để có được số năm thay thế. Đó là lý do tại sao tôi đã có mã SPARQL tất cả đã sẵn sàng để đi. Chỉ là một sự trùng hợp kỳ lạ, có lẽ. –

Trả lời

8

Một số công cụ SPARQL có thể hỗ trợ trực tiếp số học ngày. Ví dụ, như đề cập trong this answers.semanticweb.com question and answer, Jena hỗ trợ số học ngày, và bạn có thể trừ một ngày từ một ngày khác và nhận được một xsd: Thời lượng. Các triển khai khác có thể hỗ trợ chức năng dateiff. Ví dụ: this Virtuoso example bao gồm việc sử dụng bif: dateiff. Tuy nhiên, đây là những phần mở rộng và không được bảo đảm có mặt trong bất kỳ việc thực hiện SPARQL cụ thể nào.

Để có giải pháp di động, mặc dù có thể kém hiệu quả hơn, bạn có thể sử dụng year để trích xuất các phần của năm từ ngày giờ. Điều này cho phép bạn làm, ví dụ,

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) 
} 

và nhận được kết quả

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

này có khả năng được giảm một, tùy thuộc vào những tháng và ngày trong hai ngày, nhưng bạn có thể tương tự giải quyết vấn đề này bằng cách sử dụng các hàm monthday. This thread mô tả một số loại triển khai đó.

+0

Liên kết đã chết, vui lòng cập nhật. –

+0

@ KimA.Jakobsen Có một số liên kết, nhưng tôi cho rằng bạn có nghĩa là liên kết đầu tiên. Các trang web answers.semanticweb.com là một chút flaky ở lần. Tôi hy vọng rằng nó sẽ được sao lưu trước khi quá lâu. Điều đó nói rằng, máy lưu trữ internet/máy rút tiền có bản sao tại https://web.archive.org/web/20131026044936/http://answers.semanticweb.com/questions/24017/jena-arq-date-diff. –

+0

Ok, có thể đã hơi nhanh, tôi về nhà trang web sẽ sớm được sao lưu. cảm ơn cho trang lưu trữ :) –

6

Tôi tìm thấy bài đăng này khi tôi đang tìm kiếm cách tính tuổi trong SPARQL. Cảm ơn Joshua Taylor đã đưa ra gợi ý đúng. Tuy nhiên, tôi đã cải thiện phân đoạn mã bằng cách thêm một điều chỉnh để nó không bị tắt một năm nếu người đó không có sinh nhật của họ vào năm họ qua đời. Tôi nghĩ rằng nó có thể hữu ích đối với một số người, những người tìm thấy bài đăng này khi tìm kiếm chủ đề, như tôi đã làm .:

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

Vô cùng hữu ích! Cảm ơn bạn đã cập nhật. –