W3C home > Mailing lists > Public > public-rdf-dawg@w3.org > January to March 2005

Re: Please add RDF term checking operators to sparql

From: Dave Beckett <dave.beckett@bristol.ac.uk>
Date: Tue, 25 Jan 2005 16:13:57 +0000
To: Dan Connolly <connolly@w3.org>
Cc: RDF Data Access Working Group <public-rdf-dawg@w3.org>
Message-ID: <20050125161357.72d5a1cf@hoth.ilrt.bris.ac.uk>

On Tue, 25 Jan 2005 08:49:03 -0600, Dan Connolly <connolly@w3.org> wrote:

> On Tue, 2005-01-25 at 10:36 +0000, Dave Beckett wrote:
> > I think these would be useful operators for value testing of SPARQL
> > RDF Terms, to go along with lang() and dtype()* operating on
> > literal terms.
> 
> Hmmm... these make me uneasy about use/mention issues.
> It seems to me that functions should take as input
> the denotation of the terms, not the syntax of the terms.
> 
> In C, you can't write a function
> 
>   int lastDigitIsZero(float arg){ ... }
> 
> because when it's called, it will see the same
> value in both cases:
> 
>   firstDigitIsZero(23.010)
> and
>   firstDigitIsZero(23.01)

that's because C has types known only at compile time.

In python you can write such a function since a variable's type
is made at runtime (only made at runtime?  I'm not sure)

>>> foo=23.010
>>> type(foo)
<type 'float'>
>>> str(foo)[0]
'2'

and checking the types at run time

if foo is float:
  # do something
else:
  # else not

I'm asking for 'is float' functionality for the three types of RDF Term
that matter, literal, URI and blank node.

It's equivalent here since you can't tell the type of the RDF term
that will bind when you ask the question.  This functionality is
needed in order to find that out in the constraints, in order to ask
make further queries.

So AND lang(?x) = "fr"
might cause a type error or fail or warn if ?x isn't a literal

wheras
   AND isliteral(?x) && lang(?x) = "fr"
might be ok



> This is what makes me uneasy about the str() function;
> I'd rather that str(<http://www.w3.org/2000/01/rdf-schema#Literal>)
> be specified to relate class to a string, not a URI to a string.

I can't grok that.


> Consider a service that offers queries over the
> OWL closure of...
> 
>   <orglist#w3c> cyc:age [ :inYears <w3cstats#ageInYears>].
>   <w3cstats#ageInYears> owl:sameAs 10.
> 
> and a query...
> 
>   SELECT ?ORG, ?QTY
>   WHERE (?ORG cyc:age ?DUR)
>          (?DUR :inYears ?QTY)
>    AND ?QTY > 5.
> 
> Hmm... I don't think this example makes my point, because
> the OWL closure will include
> 
>   <orglist#w3c> cyc:age [ :inYears 12].
> 
> I have been uneasy about this for some time, but I can't seem
> to construct an example that makes the point sharply, so
> maybe there is no issue. But I'm still worried.
> 
> And yes, my worry applies to dtype() and lang() as well.
> 
> > 
> > I propose adding to 10.2 10.2 Value Testing / RDF Types
> >   http://www.w3.org/2001/sw/DataAccess/rq23/#sparqlTests
> > 
> > possibly a new section or could be in one of the existing ones:
> > 
> > 10.2.3 SPARQL Operations on RDF Terms
> > 
> > The following table provides operations to test if an expression is
> > one of the three RDF Terms[#href to definition in section 2.2].
> > 
> > Operator: isblank(arg)
> > Meaning: Tests if the expression is an RDF blank node
> >                 ( http://www.w3.org/TR/rdf-concepts/#dfn-blank-node )
> > Return: xsd:boolean
> >   isblank(_:a)       => true
> >   isblank(<uri>)     => false
> >   isblank("literal") => false
> > 
> > Operator: isuri(arg)
> > Meaning: Tests if the expression is an RDF URI Reference 
> >               ( http://www.w3.org/TR/rdf-concepts/#dfn-URI-reference )
> > Return: xsd:boolean
> >   isuri(<uri>)     => true
> >   isuri(_:blank)   => false
> >   isuri("literal") => false
> > 
> >   [ could be isresource() but then they are all RDF resources
> 
> Well, they all denote resources. And if you consider terms
> to be resources, then yes, they're resources. But I think
> you made a use/mention think-o there.

Possibly.  How would you protect a query from doing operations on
variables bound to RDF literals or blank nodes or URIs, that were
invalid for one or all of them?   Such as trying to do
lang() or a string equals operation on a variable bound to a URI?

Dave
Received on Tuesday, 25 January 2005 16:15:34 GMT

This archive was generated by hypermail 2.3.1 : Tuesday, 26 March 2013 16:15:22 GMT