Hello Yves,

Virtuoso knows that

FILTER (str(?uri) = 'http://dbpedia.org/resource/London')

is equivalent to

FILTER (
  (isLITERAL(?uri) && (str(?uri) =
'http://dbpedia.org/resource/London')) ||
  (isIRI(?uri) && ?uri = iri('http://dbpedia.org/resource/London')))

Then it proves that if ?uri is bound then it is bound in _subject_ position of 
a triple pattern,
hence
isLITERAL(?uri) is false and thus
(isLITERAL(?uri) && (str(?uri) = 'http://dbpedia.org/resource/London')) is false
and the condition is simplified into simpler

FILTER (?uri = iri('http://dbpedia.org/resource/London'))

that is actually a user-friendly

FILTER (?uri = <http://dbpedia.org/resource/London>)

Then Virtuoso propagates the equivalence across the query so it becomes
the equivalent of

select (<http://dbpedia.org/resource/London>) as ?uri , ?subject
where {
<http://dbpedia.org/resource/London> <http://purl.org/dc/terms/subject> ?subject
}

That's why it's so fast.


The first query can also be fast, with different wording.
I'd replace the combination of str() and || with index-friendly IN operator:

select ?uri ?subject
where {
  ?uri <http://purl.org/dc/terms/subject> ?subject
  FILTER (?uri in (
      <http://dbpedia.org/resource/London>,
      <http://dbpedia.org/resource/Family_(biology)> ) )
}


I will extend the optimizer so it will be able to deal with that "||"
better, but not right now, because even the current version replaces
"||" with "IN" for many typical uses. E.g. "||" in

select ?uri ?subject where {
  FILTER (
    ?uri = <http://dbpedia.org/resource/London> ||
    ?uri = <http://dbpedia.org/resource/Family_(biology)> )
  ?uri <http://purl.org/dc/terms/subject> ?subject  }

is optimized into "IN" automatically and runs quite ok.


Best Regards,

Ivan Mikhailov
OpenLink Software
http://virtuoso.openlinksw.com



On Mon, 2011-09-05 at 12:23 +0100, Yves Raimond wrote:
> Hello!
> 
> I noticed the following weird behavior on the public DBpedia endpoint:
> 
> """
> select ?uri ?subject
> where {
> FILTER (str(?uri) = 'http://dbpedia.org/resource/London' || str(?uri)
> = 'http://dbpedia.org/resource/Family_(biology)')
> ?uri <http://purl.org/dc/terms/subject> ?subject
> }
> """
> 
> hangs forever, while
> 
> """
> select ?uri ?subject
> where {
> FILTER (str(?uri) = 'http://dbpedia.org/resource/London')
> ?uri <http://purl.org/dc/terms/subject> ?subject
> }
> """
> 
> is very quick.
> 
> Looking at the queries, the earlier seems of approximately the same
> complexity as the latter?
> 
> Best,
> y



------------------------------------------------------------------------------
Special Offer -- Download ArcSight Logger for FREE!
Finally, a world-class log management solution at an even better 
price-free! And you'll get a free "Love Thy Logs" t-shirt when you
download Logger. Secure your free ArcSight Logger TODAY!
http://p.sf.net/sfu/arcsisghtdev2dev
_______________________________________________
Dbpedia-discussion mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/dbpedia-discussion

Reply via email to