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