BTW, there seems to be a related question on StackOverflow:
http://answers.semanticweb.com/questions/610/ordering-by-time-in-sparql-query

I might just give up building an xsd:dateTime and use separate
year/month/day components.

On Thu, Nov 14, 2013 at 7:26 PM, Martynas Jusevičius
<marty...@graphity.org> wrote:
> Andy, now I'm confused. Where are you looking? I checked the RDF/XML
> version of Time ontology and it says:
>
>   <owl:DatatypeProperty rdf:ID="year">
>     <rdfs:domain rdf:resource="#DateTimeDescription" />
>     <rdfs:range  rdf:resource="&xsd;gYear" />
>   </owl:DatatypeProperty>
>
>   <owl:DatatypeProperty rdf:ID="month">
>     <rdfs:domain rdf:resource="#DateTimeDescription" />
>     <rdfs:range  rdf:resource="&xsd;gMonth" />
>   </owl:DatatypeProperty>
>
>   <owl:DatatypeProperty rdf:ID="day">
>     <rdfs:domain rdf:resource="#DateTimeDescription" />
>     <rdfs:range  rdf:resource="&xsd;gDay" />
>   </owl:DatatypeProperty>
>
> On Thu, Nov 14, 2013 at 7:10 PM, Andy Seaborne <a...@apache.org> wrote:
>> On 14/11/13 16:42, Martynas Jusevičius wrote:
>>>
>>> OK I was probably too quick - now I realized the syntax of xsd:gMonth
>>> and xsd:gDay is not so simple...
>>
>>
>> :-)
>>
>> http://www.w3.org/TR/xmlschema11-2/#dateTime for details.
>>
>> The range of time:month is a non-negative integer so may be single digit.
>> That'll need normalizing and checking to use xsd: where it must be two
>> digits.  Ditto time:day.  And maybe people write years as two digits.
>>
>> gMonth and gDay have "missing parts" indicators "--" and "---"
>> but I don't see any g* here.
>>
>>         Andy
>>
>>
>>>
>>> On Thu, Nov 14, 2013 at 4:05 PM, Martynas Jusevičius
>>> <marty...@graphity.org> wrote:
>>>>
>>>> I came up with an approach that concatenates lexical values and
>>>> doesn't need Calendar or DateTimeStruct.
>>>>
>>>> Not sure however how this aligns with the range of time:inXSDDateTime
>>>> which is xsd:dateTime - can xsd:gYear/xsd:gMonthDay/xsd:date be
>>>> treated as xsd:dateTime values? I guess I'll have to typecast them in
>>>> SPARQL.
>>>>
>>>>          if
>>>> (resource.hasProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#inDateTime";)))
>>>>          {
>>>>              Literal dateTime;
>>>>              Resource dateTimeDesc =
>>>>
>>>> resource.getPropertyResourceValue(ResourceFactory.createProperty("http://www.w3.org/2006/time#inDateTime";));
>>>>
>>>>              if
>>>> (!dateTimeDesc.hasProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#year";)))
>>>>                  throw new DateTimeParseException("time:year value is
>>>> missing");
>>>>              RDFNode yearObject =
>>>>
>>>> dateTimeDesc.getProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#year";)).getObject();
>>>>              if (!yearObject.isLiteral())
>>>>                  throw new DateTimeParseException("time:year value is
>>>> not a Literal");
>>>>
>>>>              if
>>>> (dateTimeDesc.hasProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#month";)))
>>>>              {
>>>>                  RDFNode monthObject =
>>>>
>>>> dateTimeDesc.getProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#month";)).getObject();
>>>>                  if (!monthObject.isLiteral())
>>>>                      throw new DateTimeParseException("time:month value
>>>> is not a Literal");
>>>>
>>>>                  if
>>>>
>>>> (dateTimeDesc.hasProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#day";)))
>>>>                  {
>>>>                      RDFNode dayObject =
>>>>
>>>> dateTimeDesc.getProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#day";)).getObject();
>>>>                      if (!dayObject.isLiteral())
>>>>                          throw new DateTimeParseException("time:day
>>>> value is not a Literal");
>>>>
>>>>                      dateTime =
>>>>
>>>> resource.getModel().createTypedLiteral(yearObject.asLiteral().getLexicalForm()
>>>> + "-" +
>>>>                                  monthObject.asLiteral().getLexicalForm()
>>>> + "-" +
>>>>                                  dayObject.asLiteral().getLexicalForm(),
>>>>                              XSDDatatype.XSDdate);
>>>>                  }
>>>>                  else
>>>>                  {
>>>>                      dateTime =
>>>>
>>>> resource.getModel().createTypedLiteral(yearObject.asLiteral().getLexicalForm()
>>>> + "-" +
>>>>
>>>> monthObject.asLiteral().getLexicalForm(),
>>>>                              XSDDatatype.XSDgMonthDay);
>>>>                  }
>>>>              }
>>>>              else
>>>>                  dateTime = yearObject.asLiteral();
>>>>
>>>>
>>>> resource.addLiteral(ResourceFactory.createProperty("http://www.w3.org/2006/time#inXSDDateTime";),
>>>> dateTime);
>>>>          }
>>>>
>>>> On Thu, Nov 14, 2013 at 3:08 PM, Martynas Jusevičius
>>>> <marty...@graphity.org> wrote:
>>>>>
>>>>> I'll try DateTimeStruct again, but that basically means I need my own
>>>>> copy of the class, since I currently cannot extend it to override the
>>>>> private constructor?
>>>>>
>>>>> On Thu, Nov 14, 2013 at 2:15 PM, Andy Seaborne <a...@apache.org> wrote:
>>>>>>
>>>>>> Hi there,
>>>>>>
>>>>>> DateTimeStruct is, well, a struct. The fields are public.  You could
>>>>>> write a
>>>>>> builder to target that.  The default constructor could be made public.
>>>>>> The
>>>>>> statics are specific patterns for the XSD date/time datatypes with
>>>>>> validation.
>>>>>>
>>>>>> DateTimeStruct represents the Date/time Seven-property model of XSD.
>>>>>> It can
>>>>>> produce the string for xsd:date or xsd:dateTime but not the gregorial
>>>>>> g*
>>>>>> datatypes.
>>>>>>
>>>>>> java.util.calendar is OK as a value but, in the details, unusable for
>>>>>> XSD
>>>>>> types.  Why not set DateTimeStruct fields?
>>>>>>
>>>>>> javax.xml.datatype.XMLGregorianCalendar could be of use - it has
>>>>>> getters and
>>>>>> setters.
>>>>>>
>>>>>> For DateTimeStruct or XMLGregorianCalendar, you can then use
>>>>>>
>>>>>> createTypedLiteral(String lex, RDFDatatype dtype)
>>>>>>
>>>>>>
>>>>>>> Not all mandatory - the
>>>>>>> format can be YYYY, YYYY-MM, YYYY-MM-DD.
>>>>>>
>>>>>>
>>>>>> You could build the lexical form.
>>>>>>
>>>>>>          Andy
>>>>>>
>>>>>>
>>>>>> On 14/11/13 02:02, Martynas Jusevičius wrote:
>>>>>>>
>>>>>>>
>>>>>>> Hey,
>>>>>>>
>>>>>>> I have datetime components as 3 separate literals, with xsd:gYear,
>>>>>>> xsd:gMonth, xsd:gDay respective datatypes. Not all mandatory - the
>>>>>>> format can be YYYY, YYYY-MM, YYYY-MM-DD.
>>>>>>>
>>>>>>> Now how do I combine those into a single xsd:dateTime Literal? A
>>>>>>> concrete use case would be converting time:inDateTime values into
>>>>>>> time:inXSDDateTime values:
>>>>>>> http://www.w3.org/TR/owl-time/#calclock
>>>>>>>
>>>>>>> I came up with the code below which seems to work but is not pretty
>>>>>>> (and doesn't deal with time). I also looked at DateTimeStruct but
>>>>>>> either way there seemed to be some datatype mismatch. I think it would
>>>>>>> make more sense for DateTimeStruct to use the builder pattern instead
>>>>>>> of static methods.
>>>>>>>
>>>>>>> Is there a better way?
>>>>>>>
>>>>>>>           if
>>>>>>>
>>>>>>> (resource.hasProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#inDateTime";)))
>>>>>>>           {
>>>>>>>               Calendar calendar = Calendar.getInstance();
>>>>>>>               Resource dateTimeDesc =
>>>>>>>
>>>>>>>
>>>>>>> resource.getPropertyResourceValue(ResourceFactory.createProperty("http://www.w3.org/2006/time#inDateTime";));
>>>>>>>
>>>>>>>               if
>>>>>>>
>>>>>>> (dateTimeDesc.hasProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#year";)))
>>>>>>>               {
>>>>>>>                   RDFNode object =
>>>>>>>
>>>>>>>
>>>>>>> dateTimeDesc.getProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#year";)).getObject();
>>>>>>>                   if (object.isLiteral())
>>>>>>>                   {
>>>>>>>                       Literal literal = object.asLiteral();
>>>>>>>                       calendar.set(Calendar.YEAR,
>>>>>>> Integer.parseInt(literal.getLexicalForm()));
>>>>>>>                   }
>>>>>>>               }
>>>>>>>               else throw new DateTimeParseException("time:year value
>>>>>>> is
>>>>>>> missing");
>>>>>>>
>>>>>>>               if
>>>>>>>
>>>>>>> (dateTimeDesc.hasProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#month";)))
>>>>>>>               {
>>>>>>>                   RDFNode object =
>>>>>>>
>>>>>>>
>>>>>>> dateTimeDesc.getProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#month";)).getObject();
>>>>>>>                   if (object.isLiteral())
>>>>>>>                   {
>>>>>>>                       Literal literal = object.asLiteral();
>>>>>>>                       calendar.set(Calendar.MONTH,
>>>>>>> Integer.parseInt(literal.getLexicalForm()));
>>>>>>>                   }
>>>>>>>               }
>>>>>>>
>>>>>>>               if
>>>>>>>
>>>>>>> (dateTimeDesc.hasProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#day";)))
>>>>>>>               {
>>>>>>>                   RDFNode object =
>>>>>>>
>>>>>>>
>>>>>>> dateTimeDesc.getProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#day";)).getObject();
>>>>>>>                   if (object.isLiteral())
>>>>>>>                   {
>>>>>>>                       Literal literal = object.asLiteral();
>>>>>>>                       calendar.set(Calendar.DAY_OF_MONTH,
>>>>>>> Integer.parseInt(literal.getLexicalForm()));
>>>>>>>                   }
>>>>>>>               }
>>>>>>>
>>>>>>>               calendar.set(Calendar.HOUR, 0);
>>>>>>>               calendar.set(Calendar.MINUTE, 0);
>>>>>>>               calendar.set(Calendar.SECOND, 0);
>>>>>>>               Literal dateTime =
>>>>>>> resource.getModel().createTypedLiteral(calendar);
>>>>>>>
>>>>>>>
>>>>>>> resource.addLiteral(ResourceFactory.createProperty("http://www.w3.org/2006/time#inXSDDateTime";),
>>>>>>> dateTime);
>>>>>>>           }
>>>>>>>
>>>>>>> Martynas
>>>>>>> graphityhq.com
>>>>>>>
>>>>>>
>>

Reply via email to