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