Hello Andy,

As promised I have run a test to see if text:query allows the use of multiple 
predicates as proposed below:

>>> So if you write:
>>> 
>>> ?a text:query(pred:cv-name 'ubl AND field2:ubiquitin' 10) .
>>> 
>>> where field2 is the name of text:field name then you may be a single, 
>>> conjunctive query.
>> 
>> OK,  I will try what you suggest and tell you if it works or not.

and the answer is: Yes, it works, great !

So I can run efficiently queries with multiple criteria (fields / predicates) 
for a single subject variable.
Now If I want to text:query 2 subject variables ?a and ?b, for example:

?a text:query(pred:organ 'liver', 25) .
?b text:query(pred:author 'John Smith') .

the second query will still be called 25 times if 25 solutions are found for ?a 
during graph traveral.
Why don't we cache the result of the queries so that after the first call we 
dont invoke solr or lucene anymore but simply return an iterator on the result 
list previously built ?
Does it make sense to you ?

Cheers,
Pierre-André



On Jan 14, 2014, at 3:22 PM, Andy Seaborne <[email protected]> wrote:

> I've just changed the code to not prepend the default field to the query 
> string.
> 
> It was being done because it is needed by Solr but, on reading the Solr code 
> (again), I see now that Jena should set the default field of the SolrQuery 
> object.

I think that since solr version 4.x the default field is obsoleted.

> 
> This frees up the string to be unmangled if no predicate is given.
> 
>       Andy
> 
> On 13/01/14 16:34, Pierre-Andre Michel wrote:
>> 
>> On Jan 13, 2014, at 2:10 PM, Andy Seaborne <[email protected]> wrote:
>> 
>>> On 12/01/14 17:34, Pierre-Andre Michel wrote:
>>>> Hello,
>>>> 
>>>> I am playing with the text:query property function.
>>>> The following query searches for var ?a where must meet 2 criteria, one 
>>>> related to predicate pred:cv-name, the other one to predicate 
>>>> pred:cv-synonym.
>>>> 
>>>> PREFIX pred: <http://nextprot.org/rdf/pred/>
>>>> PREFIX afn: <http://jena.hpl.hp.com/ARQ/function#>
>>>> PREFIX fn: <http://www.w3.org/2005/xpath-functions#>
>>>> PREFIX text: <http://jena.apache.org/text#>
>>>> SELECT *
>>>> where {
>>>> ?a text:query(pred:cv-name 'ubl' 5) .     <== first criterion
>>>> ?a text:query(pred:cv-synonym 'ubiquitin' 10) .   <== second criterion
>>>> ?a pred:cv-name ?n .
>>>> ?a pred:cv-synonym ?d .
>>>> }
>>>> 
>>>> When I trace the solr index calls, here is what I see:
>>>> 
>>>> 657968 [qtp1936269821-15] INFO  org.apache.solr.core.SolrCore  ? [rdf1] 
>>>> webapp=/solr path=/select 
>>>> params={q=cv_name:ubl&wt=javabin&version=2&rows=5} hits=172 status=0 
>>>> QTime=1
>>>> 657972 [qtp1936269821-15] INFO  org.apache.solr.core.SolrCore  ? [rdf1] 
>>>> webapp=/solr path=/select 
>>>> params={q=cv_synonym:ubiquitin&wt=javabin&version=2&rows=10000} hits=256 
>>>> status=0 QTime=1
>>>> 657977 [qtp1936269821-15] INFO  org.apache.solr.core.SolrCore  ? [rdf1] 
>>>> webapp=/solr path=/select 
>>>> params={q=cv_synonym:ubiquitin&wt=javabin&version=2&rows=10000} hits=256 
>>>> status=0 QTime=1
>>>> 657982 [qtp1936269821-15] INFO  org.apache.solr.core.SolrCore  ? [rdf1] 
>>>> webapp=/solr path=/select 
>>>> params={q=cv_synonym:ubiquitin&wt=javabin&version=2&rows=10000} hits=256 
>>>> status=0 QTime=2
>>>> 657986 [qtp1936269821-15] INFO  org.apache.solr.core.SolrCore  ? [rdf1] 
>>>> webapp=/solr path=/select 
>>>> params={q=cv_synonym:ubiquitin&wt=javabin&version=2&rows=10000} hits=256 
>>>> status=0 QTime=1
>>>> 657991 [qtp1936269821-15] INFO  org.apache.solr.core.SolrCore  ? [rdf1] 
>>>> webapp=/solr path=/select 
>>>> params={q=cv_synonym:ubiquitin&wt=javabin&version=2&rows=10000} hits=256 
>>>> status=0 QTime=1
>>>> 
>>>> It seems that the search related to the second criterion is called once 
>>>> for each solution found for first criterion.
>>>> Is my interpretation correct ?
>>> 
>>> Yes - that's how this query will be executed.  ARQ normal mode of execution 
>>> is to start at some point (it does not move property functions around 
>>> because it has no idea which are selective or expensive).
>> 
>> OK...
>> 
>>> 
>>>> is there a workaround to compute mutiple text:query and do a single 
>>>> binding to var ?a ?
>>> 
>>> It may work (=> I haven't tried) to make the query name some of the fields. 
>>>  The predicate, or default if not mentioned, is always added to the front 
>>> of the string but no other processing happens.
>>> 
>>> So if you write:
>>> 
>>> ?a text:query(pred:cv-name 'ubl AND field2:ubiquitin' 10) .
>>> 
>>> where field2 is the name of text:field name then you may be a single, 
>>> conjunctive query.
>> 
>> OK,  I will try what you suggest and tell you if it works or not.
>> 
>>> 
>>> 
>>> 
>>> Looking at the code, I can see no reason why the form of query could not be 
>>> changed to
>>> 
>>> ?a text:query( predicate1 "string1"  predicate2 "string2" ... limit)
>> 
>> Would be a real improvement
>> 
>>> 
>>> The types of the items can be used to distinguish the required processing.  
>>> It would only be conjunctions though.
>>> 
>>> So maybe better is not prepend the default field name and, without a given 
>>> predicate, you get a direct lucene query string.  The default is supposed 
>>> to be the default so it shoudl not need prepending.  This, of course, needs 
>>> testing
>>> 
>>> In case anyone want to try this, see TextQueryPF.objectToStruct around line 
>>> 230.
>> 
>> 
>> Thanks a lot,
>> will feedback you during the week.
>> 
>>> 
>>>     Andy
>>> 
>>>> 
>>>> Thanky in advance for your answer,
>>>> Pierre-André
>>>> 
>>>> 
>>>> 
>>> 
>> 
> 

Reply via email to