On Wed, Jan 29, 2014 at 12:32 AM, Rob Vesse <[email protected]> wrote:
> Most likely no, did you try printing the algebra for the query?
>
> This would show you whether the query plan contains a propertyfunc
> operator or not.

Thanks, I haven't worked with these kind of extensions before, so I
didn't really know where to start.  Here are the algebra expressions
for simplified queries. The property function is called in the first
case (with (triple _ p _)), but not in the second (with (path* p)).
Neither algebra contains a propertyfunc operator, though.  Do I need
to expand this farther or something?

  Query:   select * { ?s <java:CBDSPARQLExample$sameBlank> ?o }
  Algebra: (bgp (triple ?s <java:CBDSPARQLExample$sameBlank> ?o))

  Query:   select * { ?s <java:CBDSPARQLExample$sameBlank>* ?o }
  Algebra: (path ?s (path* <java:CBDSPARQLExample$sameBlank>) ?o)

Through some more experimentation, the property function isn't called
for (seq … p …), either.  I think this is problematic.  For the `*`
case, things might be complicated, but consider a sequence pattern.
According to 9.2 Examples [1] from the SPARQL 1.1 recommendation,

[[[
Sequence: Find the names of people 2 "foaf:knows" links away.

  {
    ?x foaf:mbox <mailto:alice@example> .
    ?x foaf:knows/foaf:knows/foaf:name ?name .
  }

This is the same as the SPARQL query:

  SELECT ?x ?name
  {
     ?x  foaf:mbox <mailto:alice@example> .
     ?x  foaf:knows [ foaf:knows [ foaf:name ?name ]].
  }
]]]

Of course, the SPARQL recommendation doesn't address Jena's property
functions, but with the current behavior, property functions will be
called in:

  Query:   select * { ?s <java:CBDSPARQLExample$sameBlank> [
<java:CBDSPARQLExample$sameBlank> ?o ] }
  Algebra: (bgp
    (triple ?s <java:CBDSPARQLExample$sameBlank> ??0)
    (triple ??0 <java:CBDSPARQLExample$sameBlank> ?o)
  )

but not in:

  Query:   select * { ?s
<java:CBDSPARQLExample$sameBlank>/<java:CBDSPARQLExample$sameBlank> ?o
}
  Algebra: (path ?s (seq <java:CBDSPARQLExample$sameBlank>
<java:CBDSPARQLExample$sameBlank>) ?o)

I did run those queries on some data, and observed the log output
indicating that the property function is run in the first case, but
not the second.  I think this is counterintuitive behavior, since what
the SPARQL rec says is equivalent has different behavior.  I haven't
looked into how property paths are matched, so I don't know how hard
this is to adjust.

If this seems like something that isn't intended behavior (or even
just isn't documented), I'd be happy to make a minimal example
demonstrating the issue and put it on JIRA.

//JT

[1] http://www.w3.org/TR/sparql11-query/#propertypath-examples
-- 
Joshua Taylor, http://www.cs.rpi.edu/~tayloj/

Reply via email to