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
<[email protected]> 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 <[email protected]> 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