[Pellet-users] query bug?

Antonio Sanchez Ruiz-Granados antonio.sanchez at fdi.ucm.es
Mon Jun 2 09:11:20 UTC 2008


Thank you Evren.

Antonio.

Evren Sirin escribió:
> Hi Antonio,
>
> This looks like a bug because that part of the code was written with 
> the assumption that the query would have a single connected component 
> so rolling up the whole query to one constant would be enough. I've 
> recorded the issue in the tracker [1] and we'll look into what 
> solution is best (either what you suggest or fix the calling method to 
> handle multiple connected components).
>
> Cheers,
> Evren
>
> [1] http://cvsdude.com/trac/clark-parsia/pellet-devel/ticket/126
>
> On 5/29/08 8:47 AM, Antonio Sanchez Ruiz-Granados wrote:
>> Hi,
>>
>> I am working with Pellet 1.5.2 and I am using intensely the 
>> incremental reasoning feature of this reasoner. I also use SPARQL 
>> queries to retrieve ABox instances. After making some ABox changes, 
>> one of the SPARQL queries wasn't working as I expected. The query has 
>> the form
>>
>> ASK { dom:i1 rdf:type dom:C1. dom:i1 rdf:type dom:C2. prob:i2 
>> rdf:type dom:C3. }
>>
>> where {dom:i1, dom:i2} are two instances of my ontology and {dom:C1, 
>> dom:C2, dom:C3} are concepts.
>>
>> I started to debug the Pellet java code and I traced it to the method 
>> execBoolean of the class 
>> org.mindswap.pellet.query.impl.NoDistVarsQueryExec. I paste the code 
>> below. Reading this code if any of the query triples is UNKNOWN and 
>> the query cannot be directly asserted as false, it reaches the point 
>> below the comment "// do the unavoidable consistency check" where 
>> only the type of the first constant is checked. My problem was that 
>> my query should be false because the second instance, but the method 
>> only checks the first one (so it returns true even when it 
>> shouldn't). I have changed that part so now it checks all the 
>> constants in the query and it seems to work right, but I don't know 
>> if this is really a bug or I am misunderstanding something.
>>
>> Thanks in advance,
>> Antonio Sánchez.
>>
>>
>>     public boolean execBoolean( Query query ) {                       
>> boolean querySatisfied;
>>                kb = query.getKB();
>>                if( query.getConstants().isEmpty() ) {
>>             throw new UnsupportedFeatureException(
>>                 "Executing queries with no constants is not 
>> implemented yet!" );
>>         }
>>
>>         // unless proven otherwise all (ground) triples are satisfied
>>         Bool allTriplesSatisfied = Bool.TRUE;
>>
>>         List patterns = query.getQueryPatterns();
>>         for(int i = 0; i < patterns.size(); i++) {
>>             QueryPattern triple = (QueryPattern) patterns.get(i);
>>
>>             // by default we don't know if triple is satisfied
>>             Bool tripleSatisfied = Bool.UNKNOWN;
>>             // we can only check ground triples
>>             if( triple.isGround() ) {
>>                 tripleSatisfied = triple.isTypePattern()
>>                     ? kb.isKnownType( triple.getSubject(), 
>> triple.getObject() )                           : 
>> kb.hasKnownPropertyValue( triple.getSubject(), triple.getPredicate(), 
>> triple.getObject());
>>             }
>>                        // if we cannot decide the truth value of this 
>> triple (without a consistency
>>             // check) then over all truth value cannot be true. 
>> However, we will continue
>>             // to see if there is a triple that is obviously 
>> false                 if( tripleSatisfied.isUnknown() )
>>                 allTriplesSatisfied = Bool.UNKNOWN;
>>             else if( tripleSatisfied.isFalse() ) {
>>                 // if one triple is false then the whole query, which 
>> is the conjunction of
>>                 // all triples, is false. We can stop now.
>>                 allTriplesSatisfied = Bool.FALSE;
>>                                if( log.isTraceEnabled() )
>>                     log.trace( "Failed triple: " + triple );
>>                                break;
>>             }                           }
>>                // if we reached a verdict, return it
>>         if( allTriplesSatisfied.isKnown() )
>>             querySatisfied = allTriplesSatisfied.isTrue();
>>         else {
>>             // do the unavoidable consistency check
>>             ATermAppl testInd = (ATermAppl) 
>> query.getConstants().iterator().next();
>>             ATermAppl testClass = query.rollUpTo( testInd );
>>                    if( log.isTraceEnabled() )
>>                 log.trace( "Boolean query: " + testInd + " -> " + 
>> testClass );
>>                            querySatisfied = kb.isType( testInd, 
>> testClass );
>>         }     
>>         return querySatisfied;               }
>>
>>   
>
>


-- 
__________________________________________

Antonio A. Sanchez Ruiz-Granados
Dpto. de Ingeniería del Software e Inteligencia Artificial
Facultad de Informática
Universidad Complutense de Madrid
e-mail: antonio.sanchez at fdi.ucm.es
web: http://gaia.fdi.ucm.es/people/antonio/

___________________________________________




More information about the Pellet-users mailing list