You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@clerezza.apache.org by Hasan Hasan <ha...@trialox.org> on 2012/12/03 07:53:31 UTC

Re: Bug in SPARQL query serialization

Hi Giuseppe

can you please provide an example of the query that you use and that I can
reproduce easily?
I will try to take some time this week to have a look.

Kind regards
Hasan

On Fri, Nov 30, 2012 at 5:36 PM, Giuseppe Miscione <
g.miscione@innovationengineering.eu> wrote:

> Hi all,
> I found a bug in the SPARQL query execution chain, specifically in the
> *org.apache.clerezza.rdf.core.**sparql.query.Query* objects serialization
> made with the *org.apache.clerezza.rdf.core.**sparql.query.impl.**SimpleStringQuerySerializer*
> methods.
> The problem comes from the fact that the javacc objects used for mapping
> triple patterns are not listed in the same order as in the original query
> string. *SimpleStringQuerySerializer* serializes patterns into the ouput
> string in the order returned by the javacc parser, and so the output string
> won't always be equivalent to the source one. Moreover, parsing multiple
> times the same query string will result in different output strings.
>
> This problem is even more annoying when executing (like in my case)
> queries on graphs enanched with Pellet reasoner, because it has obviuos
> difficulties in inferencing relations if the order of triple patterns in
> the query is not the provided one.
>
> I solved the problem in my environment by simply saving the original
> string into the parsed *Query *object and then making
> *SimpleStringQuerySerializer* returns this string, without any processing.
>
> Can anyone take a look at the serializer to find a maybe better solution
> to avoid this weird behaviour?
>
> Regards,
> Giuseppe Miscione
>
>

Re: Bug in SPARQL query serialization

Posted by Hasan Hasan <ha...@trialox.org>.
Hi,

I can't resist to make the changes now ;-)

Hope this help.
Hasan

On Sat, Dec 8, 2012 at 10:09 PM, Hasan Hasan <ha...@trialox.org> wrote:

> Hi Giuseppe, Hi Reto
>
> I agree with your suggestion Giuseppe to use LinkedHashSets.
> I'll make the changes tomorrow.
>
> Good night
> Hasan
>
> On Sat, Dec 8, 2012 at 6:20 PM, Giuseppe Miscione <
> g.miscione@innovationengineering.eu> wrote:
>
>> Exactly, I was suggestion only to allocate LinkedHashSets instead of
>> HashSets.
>> I tried this solution on my code version, using LinkedHashSets in this
>> classes:
>>
>>  * org.apache.clerezza.rdf.core.**sparql.query.impl.**
>> SimpleBasicGraphPattern
>>  * org.apache.clerezza.rdf.core.**sparql.query.impl.**
>> SimpleConstructQuery
>>  * org.apache.clerezza.rdf.core.**sparql.query.impl.**SimpleDataSet
>>  * org.apache.clerezza.rdf.core.**sparql.query.impl.**
>> SimpleGroupGraphPattern
>>
>> And the test case that I suggested doesn't fail anymore. On the other
>> side, I checked the generated strings and the FILTER and OPTIONAL sentences
>> are not in the original order. This is the original query:
>>
>> *PREFIX mo: <http://www.tech-it-easy-**project.eu/ontologies/market_**
>> ontology.owl#<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>
>> >**
>> **PREFIX list: <http://jena.hpl.hp.com/ARQ/**list#<http://jena.hpl.hp.com/ARQ/list#>
>> >**
>> **PREFIX owl: <http://www.w3.org/2002/07/**owl#<http://www.w3.org/2002/07/owl#>
>> >**
>> **PREFIX rdf: <http://www.w3.org/1999/02/22-**rdf-syntax-ns#<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>> >**
>> **PREFIX rdfs: <http://www.w3.org/2000/01/**rdf-schema#<http://www.w3.org/2000/01/rdf-schema#>
>> >**
>> **PREFIX dc: <http://purl.org/dc/elements/**1.1/<http://purl.org/dc/elements/1.1/>
>> >**
>> **SELECT ?property ?range ?property_description ?subproperty
>> ?subproperty_description**
>> **WHERE**
>> **{**
>> **    ?property a owl:ObjectProperty .**
>> **    FILTER (?property != owl:bottomObjectProperty) .**
>> **    {**
>> **        {**
>> **            ?property rdfs:domain ?superclass .**
>> **            mo:Company rdfs:subClassOf ?superclass .**
>> **        }**
>> **        UNION**
>> **        {**
>> **            ?property rdfs:domain ?dunion .**
>> **            ?dunion owl:unionOf ?dlist .**
>> **            ?dlist list:member ?superclass .**
>> **            mo:Company rdfs:subClassOf ?superclass .**
>> **        }**
>> **    }**
>> **    {**
>> **        {**
>> **            ?property rdfs:range ?superrange .**
>> **            ?range rdfs:subClassOf ?superrange .**
>> **            FILTER (!isBlank(?range)) .**
>> **        }**
>> **        UNION**
>> **        {**
>> **            ?property rdfs:range ?range .**
>> **            FILTER (!isBlank(?range)) .**
>> **        }**
>> **    } .**
>> **    FILTER (?range != owl:Nothing) .**
>> **    OPTIONAL { ?somesub rdfs:subClassOf ?range . FILTER(?somesub !=
>> owl:Nothing && ?somesub != ?range)}**
>> **    FILTER (!bound(?somesub)) .**
>> **    OPTIONAL**
>> **    {**
>> **        ?subproperty rdfs:subPropertyOf ?property .**
>> **        FILTER(?subproperty != owl:bottomObjectProperty && ?subproperty
>> != ?property)**
>> **        OPTIONAL { ?subproperty dc:description ?subproperty_description
>> . }**
>> **    }**
>> **    OPTIONAL { ?property dc:description ?property_description . }**
>> **} *
>>
>> And this is the serialized string:
>>
>> *SELECT ?property ?range ?property_description ?subproperty
>> ?subproperty_description **
>> **WHERE**
>> **{**
>> **    ?property <http://www.w3.org/1999/02/22-**rdf-syntax-ns#type<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>>
>> <http://www.w3.org/2002/07/**owl#ObjectProperty<http://www.w3.org/2002/07/owl#ObjectProperty>>
>> .**
>> **    {**
>> **        {**
>> **            ?property <http://www.w3.org/2000/01/**rdf-schema#domain<http://www.w3.org/2000/01/rdf-schema#domain>>
>> ?superclass .**
>> **<http://www.tech-it-easy-**project.eu/ontologies/market_**
>> ontology.owl#Company<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#Company>>
>> <http://www.w3.org/2000/01/**rdf-schema#subClassOf<http://www.w3.org/2000/01/rdf-schema#subClassOf>>
>> ?superclass .**
>> **        } **
>> **        UNION**
>> **        {**
>> **            ?property <http://www.w3.org/2000/01/**rdf-schema#domain<http://www.w3.org/2000/01/rdf-schema#domain>>
>> ?dunion .**
>> **            ?dunion <http://www.w3.org/2002/07/**owl#unionOf<http://www.w3.org/2002/07/owl#unionOf>>
>> ?dlist .**
>> **            ?dlist <http://jena.hpl.hp.com/ARQ/**list#member<http://jena.hpl.hp.com/ARQ/list#member>>
>> ?superclass .**
>> **<http://www.tech-it-easy-**project.eu/ontologies/market_**
>> ontology.owl#Company<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#Company>>
>> <http://www.w3.org/2000/01/**rdf-schema#subClassOf<http://www.w3.org/2000/01/rdf-schema#subClassOf>>
>> ?superclass .**
>> **        }**
>> **    }**
>> **    {**
>> **        {**
>> **            ?property <http://www.w3.org/2000/01/**rdf-schema#range<http://www.w3.org/2000/01/rdf-schema#range>>
>> ?superrange .**
>> **            ?range <http://www.w3.org/2000/01/**rdf-schema#subClassOf<http://www.w3.org/2000/01/rdf-schema#subClassOf>>
>> ?superrange .**
>> **            FILTER (! (isBLANK(?range)))**
>> **        }**
>> **        UNION**
>> **        {**
>> **            ?property <http://www.w3.org/2000/01/**rdf-schema#range<http://www.w3.org/2000/01/rdf-schema#range>>
>> ?range .**
>> **            FILTER (! (isBLANK(?range)))**
>> **        }**
>> **    }**
>> **    OPTIONAL**
>> **    {**
>> **        ?somesub <http://www.w3.org/2000/01/**rdf-schema#subClassOf<http://www.w3.org/2000/01/rdf-schema#subClassOf>>
>> ?range .**
>> **        FILTER (((?somesub) != (<http://www.w3.org/2002/07/**
>> owl#Nothing <http://www.w3.org/2002/07/owl#Nothing>>)) && ((?somesub) !=
>> (?range)))**
>> **    }**
>> **    OPTIONAL**
>> **    {**
>> **        ?subproperty <http://www.w3.org/2000/01/**
>> rdf-schema#subPropertyOf<http://www.w3.org/2000/01/rdf-schema#subPropertyOf>>
>> ?property .**
>> **        OPTIONAL { ?subproperty <http://purl.org/dc/elements/**
>> 1.1/description <http://purl.org/dc/elements/1.1/description>>
>> ?subproperty_description . }**
>> **        FILTER (((?subproperty) != (<http://www.w3.org/2002/07/**
>> owl#bottomObjectProperty<http://www.w3.org/2002/07/owl#bottomObjectProperty>>))
>> && ((?subproperty) != (?property)))**
>> **    }**
>> **    OPTIONAL { ?property <http://purl.org/dc/elements/**1.1/description<http://purl.org/dc/elements/1.1/description>>
>> ?property_description . }**
>> **    FILTER ((?property) != (<http://www.w3.org/2002/07/**
>> owl#bottomObjectProperty<http://www.w3.org/2002/07/owl#bottomObjectProperty>
>> >))**
>> **    FILTER ((?range) != (<http://www.w3.org/2002/07/**owl#Nothing<http://www.w3.org/2002/07/owl#Nothing>
>> >))**
>> **    FILTER (! (BOUND(?somesub)))**
>> **} *
>>
>> I checked this version of the serialized query on the reasoner powered
>> graph that raised the problem and it worked fine.
>>
>> Il 08/12/2012 17:54, Reto Bachmann-Gmür ha scritto:
>>
>>  Ok, so you're suggesting not to change any interface but simly the
>>> implemenentation to preserve the order, if the order has no relevane by
>>> the
>>> sparql spec then I would prefer that solution.
>>>
>>> Cheers,
>>> Reto
>>>
>>> On Sat, Dec 8, 2012 at 5:42 PM, Giuseppe Miscione <
>>> g.miscione@**innovationengineering.eu<g....@innovationengineering.eu>>
>>> wrote:
>>>
>>>  Hi Reto,
>>>> in revision 1353713 SimpleBasicGraphPattern contains this code:
>>>>
>>>> public SimpleBasicGraphPattern(Set<****TriplePattern> triplePatterns) {
>>>>      this.triplePatterns = (triplePatterns == null)
>>>>      ? new HashSet<TriplePattern>()
>>>>      : triplePatterns;
>>>> }
>>>>
>>>> This implementation uses an HashSet that will mess up the order of the
>>>> added elements. By simply allocating a LinkedHashSet you'll keep the Set
>>>> logic (no duplicates) and you'll preserve the order in which the
>>>> elements
>>>> are added to the set. BasicGraphPattern won't be affected at all, it
>>>> will
>>>> continue to espose a Set, but the underlying LinkedHashSet
>>>> implementation
>>>> will keep the order of the triple patterns.
>>>> I don't know why Sets were used before (maybe to avoid the presence of a
>>>> duplicate triple pattern in the same graph pattern?), but the solution
>>>> implemented by Hasan completely changed the interface of
>>>> BasicGraphPattern
>>>> , deprecating a method and adding an equivalent one.
>>>>
>>>> Il 08/12/2012 17:13, Reto Bachmann-Gmür ha scritto:
>>>>
>>>>  Hi Giuseppe and Hasan
>>>>>
>>>>> If the order of the order of patter is relevant then this should model
>>>>> this
>>>>> as a list. Using LinkeddHashSet in BasicGraphPattern would tie this to
>>>>> a
>>>>> particular implementation. As far as I know the order of the clauses
>>>>> has
>>>>> no
>>>>> relevance by the sparql spec (like the order of triples in a graph).
>>>>> But
>>>>> we
>>>>> could maybe change our implementation so that it no longer supports
>>>>> querying by queries described as object trees but only as string, the
>>>>> parsing necessary for the fastlane could be limited to detecting the
>>>>> type
>>>>> of query (to parse the result in the right way) and the graphs agains
>>>>> which
>>>>> the query is directed.
>>>>>
>>>>> Cheers,
>>>>> Reto
>>>>>
>>>>>
>>>>> On Sat, Dec 8, 2012 at 3:45 PM, Giuseppe Miscione <
>>>>> g.miscione@**innovationenginee**ring.eu<http://innovationengineering.eu>
>>>>> <g....@innovationengineering.eu>
>>>>> >>
>>>>> wrote:
>>>>>
>>>>>   Hi Hasan,
>>>>>
>>>>>> I had a look at the code changes that you've made.
>>>>>> I saw that you introduced in the parser produced objects methods that
>>>>>> now
>>>>>> works with Lists and you've deprecated the methods working with Sets.
>>>>>> Now,
>>>>>> I have a personal cosideration: wouldn't it be easier to restore the
>>>>>> old
>>>>>> code and use LinkedHashSets instead of HashSets, without changing so
>>>>>> much
>>>>>> the class interfaces with the introduction of deprecated methods?
>>>>>>
>>>>>> Il 08/12/2012 14:27, Hasan Hasan ha scritto:
>>>>>>
>>>>>>    Hi Giuseppe
>>>>>>
>>>>>>  I have resolved the issue
>>>>>>> CLEREZZA-725<https://issues.******apache.org/jira/browse/******
>>>>>>> CLEREZZA-725 <http://apache.org/jira/browse/****CLEREZZA-725><
>>>>>>> http://apache.**org/jira/browse/**CLEREZZA-725<http://apache.org/jira/browse/**CLEREZZA-725>
>>>>>>> **>
>>>>>>> <https://issues.**apache.org/**jira/browse/**CLEREZZA-725<http://apache.org/jira/browse/**CLEREZZA-725>
>>>>>>> <htt**ps://issues.apache.org/jira/**browse/CLEREZZA-725<https://issues.apache.org/jira/browse/CLEREZZA-725>
>>>>>>> >
>>>>>>> which
>>>>>>> reflects the problem you raised.
>>>>>>>
>>>>>>> Kind regards
>>>>>>> Hasan
>>>>>>>
>>>>>>> On Tue, Dec 4, 2012 at 11:34 PM, Hasan Hasan <ha...@trialox.org>
>>>>>>> wrote:
>>>>>>>
>>>>>>>    Thanks Giuseppe
>>>>>>>
>>>>>>>  *
>>>>>>>> *
>>>>>>>> I'll try the test as soon as I have time during this week.
>>>>>>>>
>>>>>>>> Cheers
>>>>>>>> Hasan
>>>>>>>>
>>>>>>>>
>>>>>>>> On Mon, Dec 3, 2012 at 3:13 PM, Giuseppe Miscione <
>>>>>>>> g.miscione@****innovationenginee**ring.eu<htt**
>>>>>>>> p://innovationengineering.eu <http://innovationengineering.eu>>
>>>>>>>> <g.miscione@**innovationengine**ering.eu<http://innovationengineering.eu>
>>>>>>>> <g....@innovationengineering.eu>
>>>>>>>> >
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>    Hi Hasan,
>>>>>>>>
>>>>>>>>  I prepared a JUnit test method that clarifies the problem:
>>>>>>>>>
>>>>>>>>> @Test
>>>>>>>>> public void testParseMultipleTimes() throws Exception {
>>>>>>>>>        String queryString =
>>>>>>>>>            "PREFIX mo: <http://www.tech-it-easy-**
>>>>>>>>> project.eu/ontologies/market_********ontology.owl#<http://project.eu/ontologies/market_******ontology.owl#>
>>>>>>>>> <http://**project.eu/ontologies/market_******ontology.owl#<http://project.eu/ontologies/market_****ontology.owl#>
>>>>>>>>> >
>>>>>>>>> <http://**project.eu/**ontologies/market_******ontology.owl#<http://project.eu/ontologies/market_****ontology.owl#>
>>>>>>>>> <http://project.**eu/ontologies/market_****ontology.owl#<http://project.eu/ontologies/market_**ontology.owl#>
>>>>>>>>> >
>>>>>>>>> <http://www.**tech-it-easy-**p**roject.eu/**ontologies/**<http://project.eu/**ontologies/**>
>>>>>>>>> market_ontology.**<http://**tech-it-easy-project.eu/****
>>>>>>>>> ontologies/market_ontology.**<http://tech-it-easy-project.eu/**ontologies/market_ontology.**>
>>>>>>>>> >
>>>>>>>>>
>>>>>>>>> owl#<http://www.tech-it-easy-****project.eu/ontologies/market_****<http://project.eu/ontologies/market_**>
>>>>>>>>> ontology.owl#<http://www.tech-**it-easy-project.eu/ontologies/**
>>>>>>>>> market_ontology.owl#<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>
>>>>>>>>> >
>>>>>>>>>
>>>>>>>>>> \n"
>>>>>>>>>> +
>>>>>>>>>>
>>>>>>>>>            "PREFIX list: <http://jena.hpl.hp.com/ARQ/********list#<http://jena.hpl.hp.com/ARQ/******list#>
>>>>>>>>> <http://jena.hpl.hp.**com/ARQ/****list#<http://jena.hpl.hp.com/ARQ/****list#>
>>>>>>>>> >
>>>>>>>>> <http://jena.hpl.hp.**com/ARQ/****list#<http://jena.hpl.hp.**
>>>>>>>>> com/ARQ/**list# <http://jena.hpl.hp.com/ARQ/**list#>>
>>>>>>>>> <http://jena.hpl.hp.com/**ARQ/****list#<http://jena.hpl.hp.com/**ARQ/**list#>
>>>>>>>>> <http://jena.hpl.hp.**com/**ARQ/list#<http://jena.hpl.hp.com/**ARQ/list#>
>>>>>>>>> ><
>>>>>>>>> http://jena.hpl.hp.com/ARQ/****list#<http://jena.hpl.hp.com/ARQ/**list#><
>>>>>>>>> http://jena.hpl.hp.com/ARQ/**list#<http://jena.hpl.hp.com/ARQ/list#>
>>>>>>>>> >
>>>>>>>>>
>>>>>>>>>> \n"
>>>>>>>>>> +
>>>>>>>>>>
>>>>>>>>>            "PREFIX owl: <http://www.w3.org/2002/07/********owl#<http://www.w3.org/2002/07/******owl#>
>>>>>>>>> <http://www.w3.org/**2002/07/****owl#<http://www.w3.org/2002/07/****owl#>
>>>>>>>>> >
>>>>>>>>> <http://www.w3.org/2002/**07/****owl#<http://www.w3.org/2002/**07/**owl#>
>>>>>>>>> <http://www.w3.org/2002/**07/**owl#<http://www.w3.org/2002/07/**owl#>
>>>>>>>>> >
>>>>>>>>> <http://www.w3.org/2002/**07/****owl#<http://www.w3.org/2002/**07/**owl#>
>>>>>>>>> <http://www.w3.org/2002/****07/owl#<http://www.w3.org/2002/**07/owl#>
>>>>>>>>> ><
>>>>>>>>> http://www.w3.org/2002/07/****owl#<http://www.w3.org/2002/07/**owl#><
>>>>>>>>> http://www.w3.org/2002/07/**owl# <http://www.w3.org/2002/07/owl#>>
>>>>>>>>>
>>>>>>>>>> \n"
>>>>>>>>>>>>
>>>>>>>>>>> +
>>>>>>>>>            "PREFIX rdf: <http://www.w3.org/1999/02/22-****<http://www.w3.org/1999/02/22-**>
>>>>>>>>> ****rdf-syntax-ns# <http://www.w3.org/1999/02/22-**
>>>>>>>>> ****rdf-syntax-ns#<http://www.w3.org/1999/02/22-****rdf-syntax-ns#>
>>>>>>>>> ><
>>>>>>>>> http://www.**w3.org/1999/02/**22-**rdf-**syntax-ns#<http://w3.org/1999/02/22-**rdf-**syntax-ns#>
>>>>>>>>> <http://**www.w3.org/1999/02/22-**rdf-**syntax-ns#<http://www.w3.org/1999/02/22-**rdf-syntax-ns#>
>>>>>>>>> >
>>>>>>>>> <http://www.**w3.org/1999/02/****22-rdf-syntax-**ns#<http://w3.org/1999/02/**22-rdf-syntax-**ns#>
>>>>>>>>> <http://**w3.org/1999/02/22-rdf-syntax-****ns#<http://w3.org/1999/02/22-rdf-syntax-**ns#>
>>>>>>>>> >
>>>>>>>>> <http://**www.w3.org/1999/02/**22-rdf-**syntax-ns#<http://www.w3.org/1999/02/22-rdf-**syntax-ns#>
>>>>>>>>> <http://**www.w3.org/1999/02/22-rdf-**syntax-ns#<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>>>>>>>>> >
>>>>>>>>>
>>>>>>>>>> \n"
>>>>>>>>>> +
>>>>>>>>>>
>>>>>>>>>            "PREFIX rdfs: <http://www.w3.org/2000/01/*****
>>>>>>>>> ***rdf-schema# <http://www.w3.org/2000/01/******rdf-schema#><
>>>>>>>>> http://www.w3.**org/2000/01/****rdf-schema#<http://www.w3.org/2000/01/****rdf-schema#>
>>>>>>>>> >
>>>>>>>>> <http://www.w3.**org/2000/01/****rdf-schema#<http://www.w3.**
>>>>>>>>> org/2000/01/**rdf-schema#<http://www.w3.org/2000/01/**rdf-schema#>
>>>>>>>>> >
>>>>>>>>> <http://www.w3.org/**2000/01/****rdf-schema#<http://www.w3.org/**2000/01/**rdf-schema#>
>>>>>>>>> <http://www.w3.**org/**2000/01/rdf-schema#<http://www.w3.org/**2000/01/rdf-schema#>
>>>>>>>>> >
>>>>>>>>> <http://www.w3.org/**2000/01/**rdf-schema#<http://www.w3.org/**2000/01/rdf-schema#>
>>>>>>>>> <http://www.w3.org/**2000/01/rdf-schema#<http://www.w3.org/2000/01/rdf-schema#>
>>>>>>>>> >
>>>>>>>>>
>>>>>>>>>> \n"
>>>>>>>>>> +
>>>>>>>>>>
>>>>>>>>>            "PREFIX dc: <http://purl.org/dc/elements/********1.1/<http://purl.org/dc/elements/******1.1/>
>>>>>>>>> <http://purl.org/dc/**elements/****1.1/<http://purl.org/dc/elements/****1.1/>
>>>>>>>>> >
>>>>>>>>> <http://purl.org/dc/****elements/**1.1/<http://purl.org/dc/**elements/**1.1/>
>>>>>>>>> <http://purl.**org/dc/elements/**1.1/<http://purl.org/dc/elements/**1.1/>
>>>>>>>>> >
>>>>>>>>> <http://purl.org/dc/******elements/1.1/<http://purl.org/dc/****elements/1.1/>
>>>>>>>>> <http://purl.org/**dc/**elements/1.1/<http://purl.org/dc/**elements/1.1/>
>>>>>>>>> ><
>>>>>>>>> http://purl.org/dc/elements/****1.1/<http://purl.org/dc/elements/**1.1/><
>>>>>>>>> http://purl.org/dc/elements/**1.1/<http://purl.org/dc/elements/1.1/>
>>>>>>>>> >
>>>>>>>>>   \n"
>>>>>>>>>
>>>>>>>>>> +
>>>>>>>>>>
>>>>>>>>>            "SELECT ?property ?range ?property_description
>>>>>>>>> ?subproperty
>>>>>>>>> ?subproperty_description\n" +
>>>>>>>>>            "WHERE {\n" +
>>>>>>>>>            "    ?property a owl:ObjectProperty .\n" +
>>>>>>>>>            "    FILTER (?property != owl:bottomObjectProperty)
>>>>>>>>> .\n" +
>>>>>>>>>            "    {\n" +
>>>>>>>>>            "        {\n" +
>>>>>>>>>            "            ?property rdfs:domain ?superclass .\n" +
>>>>>>>>>            "            mo:Company rdfs:subClassOf ?superclass
>>>>>>>>> .\n" +
>>>>>>>>>            "        }\n" +
>>>>>>>>>            "        UNION\n" +
>>>>>>>>>            "        {\n" +
>>>>>>>>>            "            ?property rdfs:domain ?dunion .\n" +
>>>>>>>>>            "            ?dunion owl:unionOf ?dlist .\n" +
>>>>>>>>>            "            ?dlist list:member ?superclass .\n" +
>>>>>>>>>            "            mo:Company rdfs:subClassOf ?superclass
>>>>>>>>> .\n" +
>>>>>>>>>            "        }\n" +
>>>>>>>>>            "    }\n" +
>>>>>>>>>            "    {\n" +
>>>>>>>>>            "        {\n" +
>>>>>>>>>            "            ?property rdfs:range ?superrange .\n" +
>>>>>>>>>            "            ?range rdfs:subClassOf ?superrange .\n" +
>>>>>>>>>            "            FILTER (!isBlank(?range)) .\n" +
>>>>>>>>>            "        }\n" +
>>>>>>>>>            "        UNION\n" +
>>>>>>>>>            "        {\n" +
>>>>>>>>>            "            ?property rdfs:range ?range .\n" +
>>>>>>>>>            "            FILTER (!isBlank(?range)) .\n" +
>>>>>>>>>            "        }\n" +
>>>>>>>>>            "    } .\n" +
>>>>>>>>>            "    FILTER (?range != owl:Nothing) .\n" +
>>>>>>>>>            "    OPTIONAL { ?somesub rdfs:subClassOf ?range .
>>>>>>>>> FILTER(?somesub
>>>>>>>>> != owl:Nothing && ?somesub != ?range)}\n" +
>>>>>>>>>            "    FILTER (!bound(?somesub)) .\n" +
>>>>>>>>>            "    OPTIONAL {\n" +
>>>>>>>>>            "        ?subproperty rdfs:subPropertyOf ?property .\n"
>>>>>>>>> +
>>>>>>>>>            "        FILTER(?subproperty !=
>>>>>>>>> owl:bottomObjectProperty &&
>>>>>>>>> ?subproperty != ?property)\n" +
>>>>>>>>>            "        OPTIONAL { ?subproperty dc:description
>>>>>>>>> ?subproperty_description . }\n" +
>>>>>>>>>            "    }\n" +
>>>>>>>>>            "    OPTIONAL { ?property dc:description
>>>>>>>>> ?property_description
>>>>>>>>> .
>>>>>>>>> }\n" +
>>>>>>>>>            "} ";
>>>>>>>>>
>>>>>>>>>        Query query1 = QueryParser.getInstance().********
>>>>>>>>> parse(queryString);
>>>>>>>>>        System.out.println(query1.********toString());
>>>>>>>>>
>>>>>>>>>        System.out.println("----------********-------------");
>>>>>>>>>
>>>>>>>>>        Thread.sleep(5000l);
>>>>>>>>>
>>>>>>>>>        Query query2 = QueryParser.getInstance().********
>>>>>>>>> parse(queryString);
>>>>>>>>>        System.out.println(query2.********toString());
>>>>>>>>>
>>>>>>>>>        Assert.assertEquals(query1.********toString(),
>>>>>>>>> query2.toString());
>>>>>>>>>
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>> By separating the two parse() calls with a 5 seconds sleep, you'll
>>>>>>>>> see
>>>>>>>>> that the two parsed objects will produce different strings. Without
>>>>>>>>> the
>>>>>>>>> Thread.sleep() call the test method doesn't fail, so I think
>>>>>>>>> there's
>>>>>>>>> something time-related in the javacc parser that will mix up the
>>>>>>>>> parsed
>>>>>>>>> statements.
>>>>>>>>>
>>>>>>>>> Regards,
>>>>>>>>> Giuseppe
>>>>>>>>>
>>>>>>>>> Il 03/12/2012 10:25, Giuseppe Miscione ha scritto:
>>>>>>>>>
>>>>>>>>>     Hi Hasan,
>>>>>>>>>
>>>>>>>>>   this is the query on which I was working:
>>>>>>>>>
>>>>>>>>>> PREFIX mo: <http://www.tech-it-easy-******pro**
>>>>>>>>>> ject.eu/ontologies/market_** <http://project.eu/ontologies/****<http://project.eu/ontologies/**>
>>>>>>>>>> market_** <http://project.eu/ontologies/**market_**<http://project.eu/ontologies/market_**>
>>>>>>>>>> >>
>>>>>>>>>> ontology.owl#<http://www.tech-******it-easy-project.eu/****
>>>>>>>>>> ontologies/** <http://it-easy-project.eu/**ontologies/**><
>>>>>>>>>> http://it-easy-**project.eu/ontologies/**<http://it-easy-project.eu/ontologies/**>
>>>>>>>>>> >
>>>>>>>>>> market_ontology.owl#<http://****www.tech-it-easy-project.eu/**<http://www.tech-it-easy-project.eu/**>
>>>>>>>>>> ontologies/market_ontology.****owl#<http://www.tech-it-easy-**
>>>>>>>>>> project.eu/ontologies/market_**ontology.owl#<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>
>>>>>>>>>> >
>>>>>>>>>> PREFIX list: <http://jena.hpl.hp.com/ARQ/********list#<http://jena.hpl.hp.com/ARQ/******list#>
>>>>>>>>>> <http://jena.hpl.hp.**com/ARQ/****list#<http://jena.hpl.hp.com/ARQ/****list#>
>>>>>>>>>> >
>>>>>>>>>> <http://jena.hpl.hp.**com/ARQ/****list#<http://jena.hpl.hp.**
>>>>>>>>>> com/ARQ/**list# <http://jena.hpl.hp.com/ARQ/**list#>>
>>>>>>>>>> <http://jena.hpl.hp.com/**ARQ/****list#<http://jena.hpl.hp.com/**ARQ/**list#>
>>>>>>>>>> <http://jena.hpl.hp.**com/**ARQ/list#<http://jena.hpl.hp.com/**ARQ/list#>
>>>>>>>>>> ><
>>>>>>>>>> http://jena.hpl.hp.com/ARQ/****list#<http://jena.hpl.hp.com/ARQ/**list#>
>>>>>>>>>> <http://jena.hpl.hp.com/**ARQ/list#<http://jena.hpl.hp.com/ARQ/list#>
>>>>>>>>>> >
>>>>>>>>>> PREFIX owl: <http://www.w3.org/2002/07/********owl#<http://www.w3.org/2002/07/******owl#>
>>>>>>>>>> <http://www.w3.org/**2002/07/****owl#<http://www.w3.org/2002/07/****owl#>
>>>>>>>>>> >
>>>>>>>>>> <http://www.w3.org/2002/**07/****owl#<http://www.w3.org/2002/**07/**owl#>
>>>>>>>>>> <http://www.w3.org/2002/**07/**owl#<http://www.w3.org/2002/07/**owl#>
>>>>>>>>>> >
>>>>>>>>>> <http://www.w3.org/2002/**07/****owl#<http://www.w3.org/2002/**07/**owl#>
>>>>>>>>>> <http://www.w3.org/2002/****07/owl#<http://www.w3.org/2002/**07/owl#>
>>>>>>>>>> ><
>>>>>>>>>> http://www.w3.org/2002/07/****owl#<http://www.w3.org/2002/07/**owl#><
>>>>>>>>>> http://www.w3.org/2002/07/**owl# <http://www.w3.org/2002/07/owl#>
>>>>>>>>>> >>>
>>>>>>>>>> PREFIX rdf: <http://www.w3.org/1999/02/22-********rdf-syntax-ns#<http://www.w3.org/1999/02/22-******rdf-syntax-ns#>
>>>>>>>>>> <http://**www.w3.org/1999/02/22-****rdf-**syntax-ns#<http://www.w3.org/1999/02/22-****rdf-syntax-ns#>
>>>>>>>>>> >
>>>>>>>>>> <http://www.**w3.org/1999/02/**22-**rdf-**syntax-ns#<http://w3.org/1999/02/22-**rdf-**syntax-ns#>
>>>>>>>>>> <http://**www.w3.org/1999/02/22-**rdf-**syntax-ns#<http://www.w3.org/1999/02/22-**rdf-syntax-ns#>
>>>>>>>>>> >
>>>>>>>>>> <http://www.**w3.org/1999/02/****22-rdf-syntax-**ns#<http://w3.org/1999/02/**22-rdf-syntax-**ns#>
>>>>>>>>>> <http://**w3.org/1999/02/22-rdf-syntax-****ns#<http://w3.org/1999/02/22-rdf-syntax-**ns#>
>>>>>>>>>> >
>>>>>>>>>> <http://**www.w3.org/1999/02/**22-rdf-**syntax-ns#<http://www.w3.org/1999/02/22-rdf-**syntax-ns#>
>>>>>>>>>> <http://**www.w3.org/1999/02/22-rdf-**syntax-ns#<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>>>>>>>>>> >
>>>>>>>>>> PREFIX rdfs: <http://www.w3.org/2000/01/********rdf-schema#<http://www.w3.org/2000/01/******rdf-schema#>
>>>>>>>>>> <http://www.w3.**org/2000/01/****rdf-schema#<http://www.w3.org/2000/01/****rdf-schema#>
>>>>>>>>>> >
>>>>>>>>>> <http://www.w3.**org/2000/01/****rdf-schema#<http://www.w3.**
>>>>>>>>>> org/2000/01/**rdf-schema#<http://www.w3.org/2000/01/**rdf-schema#>
>>>>>>>>>> >
>>>>>>>>>> <http://www.w3.org/**2000/01/****rdf-schema#<http://www.w3.org/**2000/01/**rdf-schema#>
>>>>>>>>>> <http://www.w3.**org/**2000/01/rdf-schema#<http://www.w3.org/**2000/01/rdf-schema#>
>>>>>>>>>> >
>>>>>>>>>> <http://www.w3.org/**2000/01/**rdf-schema#<http://www.w3.org/**2000/01/rdf-schema#>
>>>>>>>>>> <http://www.w3.org/**2000/01/rdf-schema#<http://www.w3.org/2000/01/rdf-schema#>
>>>>>>>>>> >
>>>>>>>>>> PREFIX dc: <http://purl.org/dc/elements/********1.1/<http://purl.org/dc/elements/******1.1/>
>>>>>>>>>> <http://purl.org/dc/**elements/****1.1/<http://purl.org/dc/elements/****1.1/>
>>>>>>>>>> >
>>>>>>>>>> <http://purl.org/dc/****elements/**1.1/<http://purl.org/dc/**elements/**1.1/>
>>>>>>>>>> <http://purl.**org/dc/elements/**1.1/<http://purl.org/dc/elements/**1.1/>
>>>>>>>>>> >
>>>>>>>>>> <http://purl.org/dc/******elements/1.1/<http://purl.org/dc/****elements/1.1/>
>>>>>>>>>> <http://purl.org/**dc/**elements/1.1/<http://purl.org/dc/**elements/1.1/>
>>>>>>>>>> ><
>>>>>>>>>> http://purl.org/dc/elements/****1.1/<http://purl.org/dc/elements/**1.1/>
>>>>>>>>>> <http://purl.org/dc/**elements/1.1/<http://purl.org/dc/elements/1.1/>
>>>>>>>>>> >
>>>>>>>>>> SELECT ?property ?range ?property_description ?subproperty
>>>>>>>>>> ?subproperty_description
>>>>>>>>>> WHERE {
>>>>>>>>>>        ?property a owl:ObjectProperty .
>>>>>>>>>>        FILTER (?property != owl:bottomObjectProperty) .
>>>>>>>>>>        {
>>>>>>>>>>            {
>>>>>>>>>>                ?property rdfs:domain ?superclass .
>>>>>>>>>>                mo:Company rdfs:subClassOf ?superclass .
>>>>>>>>>>            }
>>>>>>>>>>            UNION
>>>>>>>>>>            {
>>>>>>>>>>                ?property rdfs:domain ?dunion .
>>>>>>>>>>                ?dunion owl:unionOf ?dlist .
>>>>>>>>>>                ?dlist list:member ?superclass .
>>>>>>>>>>                mo:Company rdfs:subClassOf ?superclass .
>>>>>>>>>>            }
>>>>>>>>>>        }
>>>>>>>>>>        {
>>>>>>>>>>            {
>>>>>>>>>>                ?property rdfs:range ?superrange .
>>>>>>>>>>                ?range rdfs:subClassOf ?superrange .
>>>>>>>>>>                FILTER (!isBlank(?range)) .
>>>>>>>>>>            }
>>>>>>>>>>            UNION
>>>>>>>>>>            {
>>>>>>>>>>                ?property rdfs:range ?range .
>>>>>>>>>>                FILTER (!isBlank(?range)) .
>>>>>>>>>>            }
>>>>>>>>>>        } .
>>>>>>>>>>        FILTER (?range != owl:Nothing) .
>>>>>>>>>>        OPTIONAL { ?somesub rdfs:subClassOf ?range .
>>>>>>>>>> FILTER(?somesub !=
>>>>>>>>>> owl:Nothing && ?somesub != ?range)}
>>>>>>>>>>        FILTER (!bound(?somesub)) .
>>>>>>>>>>        OPTIONAL {
>>>>>>>>>>            ?subproperty rdfs:subPropertyOf ?property .
>>>>>>>>>>            FILTER(?subproperty != owl:bottomObjectProperty &&
>>>>>>>>>> ?subproperty
>>>>>>>>>> != ?property)
>>>>>>>>>>            OPTIONAL { ?subproperty dc:description
>>>>>>>>>> ?subproperty_description
>>>>>>>>>> . }
>>>>>>>>>>        }
>>>>>>>>>>        OPTIONAL { ?property dc:description ?property_description
>>>>>>>>>> . }
>>>>>>>>>> }
>>>>>>>>>>
>>>>>>>>>> Il 03/12/2012 07:53, Hasan Hasan ha scritto:
>>>>>>>>>>
>>>>>>>>>>    Hi Giuseppe
>>>>>>>>>>
>>>>>>>>>>  can you please provide an example of the query that you use and
>>>>>>>>>>> that I
>>>>>>>>>>> can
>>>>>>>>>>> reproduce easily?
>>>>>>>>>>> I will try to take some time this week to have a look.
>>>>>>>>>>>
>>>>>>>>>>> Kind regards
>>>>>>>>>>> Hasan
>>>>>>>>>>>
>>>>>>>>>>> On Fri, Nov 30, 2012 at 5:36 PM, Giuseppe Miscione <
>>>>>>>>>>> g.miscione@******innovationenginee**ring.eu<**htt**
>>>>>>>>>>> p://innovationengineering.eu <http://innovationengineering.**eu<http://innovationengineering.eu>
>>>>>>>>>>> >>
>>>>>>>>>>>
>>>>>>>>>>> <g.miscione@****innovationengine**ering.eu<htt**
>>>>>>>>>>> p://innovationengineering.eu <http://innovationengineering.eu>>
>>>>>>>>>>> <g.miscione@**innovationengine**ering.eu<http://innovationengineering.eu>
>>>>>>>>>>> <g....@innovationengineering.eu>
>>>>>>>>>>> >
>>>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>>     Hi all,
>>>>>>>>>>>
>>>>>>>>>>>   I found a bug in the SPARQL query execution chain,
>>>>>>>>>>> specifically in
>>>>>>>>>>>
>>>>>>>>>>>> the
>>>>>>>>>>>> *org.apache.clerezza.rdf.core.**********sparql.query.Query*
>>>>>>>>>>>> objects
>>>>>>>>>>>>
>>>>>>>>>>>> serialization
>>>>>>>>>>>> made with the *org.apache.clerezza.rdf.core.******
>>>>>>>>>>>> ****sparql.query.impl.****
>>>>>>>>>>>> SimpleStringQuerySerializer*
>>>>>>>>>>>> methods.
>>>>>>>>>>>> The problem comes from the fact that the javacc objects used for
>>>>>>>>>>>> mapping
>>>>>>>>>>>> triple patterns are not listed in the same order as in the
>>>>>>>>>>>> original
>>>>>>>>>>>> query
>>>>>>>>>>>> string. *SimpleStringQuerySerializer* serializes patterns into
>>>>>>>>>>>> the
>>>>>>>>>>>> ouput
>>>>>>>>>>>> string in the order returned by the javacc parser, and so the
>>>>>>>>>>>> output
>>>>>>>>>>>> string
>>>>>>>>>>>> won't always be equivalent to the source one. Moreover, parsing
>>>>>>>>>>>> multiple
>>>>>>>>>>>> times the same query string will result in different output
>>>>>>>>>>>> strings.
>>>>>>>>>>>>
>>>>>>>>>>>> This problem is even more annoying when executing (like in my
>>>>>>>>>>>> case)
>>>>>>>>>>>> queries on graphs enanched with Pellet reasoner, because it has
>>>>>>>>>>>> obviuos
>>>>>>>>>>>> difficulties in inferencing relations if the order of triple
>>>>>>>>>>>> patterns
>>>>>>>>>>>> in
>>>>>>>>>>>> the query is not the provided one.
>>>>>>>>>>>>
>>>>>>>>>>>> I solved the problem in my environment by simply saving the
>>>>>>>>>>>> original
>>>>>>>>>>>> string into the parsed *Query *object and then making
>>>>>>>>>>>> *SimpleStringQuerySerializer* returns this string, without any
>>>>>>>>>>>> processing.
>>>>>>>>>>>>
>>>>>>>>>>>> Can anyone take a look at the serializer to find a maybe better
>>>>>>>>>>>> solution
>>>>>>>>>>>> to avoid this weird behaviour?
>>>>>>>>>>>>
>>>>>>>>>>>> Regards,
>>>>>>>>>>>> Giuseppe Miscione
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>
>

Re: Bug in SPARQL query serialization

Posted by Hasan Hasan <ha...@trialox.org>.
Hi Giuseppe, Hi Reto

I agree with your suggestion Giuseppe to use LinkedHashSets.
I'll make the changes tomorrow.

Good night
Hasan

On Sat, Dec 8, 2012 at 6:20 PM, Giuseppe Miscione <
g.miscione@innovationengineering.eu> wrote:

> Exactly, I was suggestion only to allocate LinkedHashSets instead of
> HashSets.
> I tried this solution on my code version, using LinkedHashSets in this
> classes:
>
>  * org.apache.clerezza.rdf.core.**sparql.query.impl.**
> SimpleBasicGraphPattern
>  * org.apache.clerezza.rdf.core.**sparql.query.impl.**SimpleConstructQuery
>  * org.apache.clerezza.rdf.core.**sparql.query.impl.**SimpleDataSet
>  * org.apache.clerezza.rdf.core.**sparql.query.impl.**
> SimpleGroupGraphPattern
>
> And the test case that I suggested doesn't fail anymore. On the other
> side, I checked the generated strings and the FILTER and OPTIONAL sentences
> are not in the original order. This is the original query:
>
> *PREFIX mo: <http://www.tech-it-easy-**project.eu/ontologies/market_**
> ontology.owl#<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>
> >**
> **PREFIX list: <http://jena.hpl.hp.com/ARQ/**list#<http://jena.hpl.hp.com/ARQ/list#>
> >**
> **PREFIX owl: <http://www.w3.org/2002/07/**owl#<http://www.w3.org/2002/07/owl#>
> >**
> **PREFIX rdf: <http://www.w3.org/1999/02/22-**rdf-syntax-ns#<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
> >**
> **PREFIX rdfs: <http://www.w3.org/2000/01/**rdf-schema#<http://www.w3.org/2000/01/rdf-schema#>
> >**
> **PREFIX dc: <http://purl.org/dc/elements/**1.1/<http://purl.org/dc/elements/1.1/>
> >**
> **SELECT ?property ?range ?property_description ?subproperty
> ?subproperty_description**
> **WHERE**
> **{**
> **    ?property a owl:ObjectProperty .**
> **    FILTER (?property != owl:bottomObjectProperty) .**
> **    {**
> **        {**
> **            ?property rdfs:domain ?superclass .**
> **            mo:Company rdfs:subClassOf ?superclass .**
> **        }**
> **        UNION**
> **        {**
> **            ?property rdfs:domain ?dunion .**
> **            ?dunion owl:unionOf ?dlist .**
> **            ?dlist list:member ?superclass .**
> **            mo:Company rdfs:subClassOf ?superclass .**
> **        }**
> **    }**
> **    {**
> **        {**
> **            ?property rdfs:range ?superrange .**
> **            ?range rdfs:subClassOf ?superrange .**
> **            FILTER (!isBlank(?range)) .**
> **        }**
> **        UNION**
> **        {**
> **            ?property rdfs:range ?range .**
> **            FILTER (!isBlank(?range)) .**
> **        }**
> **    } .**
> **    FILTER (?range != owl:Nothing) .**
> **    OPTIONAL { ?somesub rdfs:subClassOf ?range . FILTER(?somesub !=
> owl:Nothing && ?somesub != ?range)}**
> **    FILTER (!bound(?somesub)) .**
> **    OPTIONAL**
> **    {**
> **        ?subproperty rdfs:subPropertyOf ?property .**
> **        FILTER(?subproperty != owl:bottomObjectProperty && ?subproperty
> != ?property)**
> **        OPTIONAL { ?subproperty dc:description ?subproperty_description
> . }**
> **    }**
> **    OPTIONAL { ?property dc:description ?property_description . }**
> **} *
>
> And this is the serialized string:
>
> *SELECT ?property ?range ?property_description ?subproperty
> ?subproperty_description **
> **WHERE**
> **{**
> **    ?property <http://www.w3.org/1999/02/22-**rdf-syntax-ns#type<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>>
> <http://www.w3.org/2002/07/**owl#ObjectProperty<http://www.w3.org/2002/07/owl#ObjectProperty>>
> .**
> **    {**
> **        {**
> **            ?property <http://www.w3.org/2000/01/**rdf-schema#domain<http://www.w3.org/2000/01/rdf-schema#domain>>
> ?superclass .**
> **<http://www.tech-it-easy-**project.eu/ontologies/market_**
> ontology.owl#Company<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#Company>>
> <http://www.w3.org/2000/01/**rdf-schema#subClassOf<http://www.w3.org/2000/01/rdf-schema#subClassOf>>
> ?superclass .**
> **        } **
> **        UNION**
> **        {**
> **            ?property <http://www.w3.org/2000/01/**rdf-schema#domain<http://www.w3.org/2000/01/rdf-schema#domain>>
> ?dunion .**
> **            ?dunion <http://www.w3.org/2002/07/**owl#unionOf<http://www.w3.org/2002/07/owl#unionOf>>
> ?dlist .**
> **            ?dlist <http://jena.hpl.hp.com/ARQ/**list#member<http://jena.hpl.hp.com/ARQ/list#member>>
> ?superclass .**
> **<http://www.tech-it-easy-**project.eu/ontologies/market_**
> ontology.owl#Company<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#Company>>
> <http://www.w3.org/2000/01/**rdf-schema#subClassOf<http://www.w3.org/2000/01/rdf-schema#subClassOf>>
> ?superclass .**
> **        }**
> **    }**
> **    {**
> **        {**
> **            ?property <http://www.w3.org/2000/01/**rdf-schema#range<http://www.w3.org/2000/01/rdf-schema#range>>
> ?superrange .**
> **            ?range <http://www.w3.org/2000/01/**rdf-schema#subClassOf<http://www.w3.org/2000/01/rdf-schema#subClassOf>>
> ?superrange .**
> **            FILTER (! (isBLANK(?range)))**
> **        }**
> **        UNION**
> **        {**
> **            ?property <http://www.w3.org/2000/01/**rdf-schema#range<http://www.w3.org/2000/01/rdf-schema#range>>
> ?range .**
> **            FILTER (! (isBLANK(?range)))**
> **        }**
> **    }**
> **    OPTIONAL**
> **    {**
> **        ?somesub <http://www.w3.org/2000/01/**rdf-schema#subClassOf<http://www.w3.org/2000/01/rdf-schema#subClassOf>>
> ?range .**
> **        FILTER (((?somesub) != (<http://www.w3.org/2002/07/**owl#Nothing<http://www.w3.org/2002/07/owl#Nothing>>))
> && ((?somesub) != (?range)))**
> **    }**
> **    OPTIONAL**
> **    {**
> **        ?subproperty <http://www.w3.org/2000/01/**
> rdf-schema#subPropertyOf<http://www.w3.org/2000/01/rdf-schema#subPropertyOf>>
> ?property .**
> **        OPTIONAL { ?subproperty <http://purl.org/dc/elements/**
> 1.1/description <http://purl.org/dc/elements/1.1/description>>
> ?subproperty_description . }**
> **        FILTER (((?subproperty) != (<http://www.w3.org/2002/07/**
> owl#bottomObjectProperty<http://www.w3.org/2002/07/owl#bottomObjectProperty>>))
> && ((?subproperty) != (?property)))**
> **    }**
> **    OPTIONAL { ?property <http://purl.org/dc/elements/**1.1/description<http://purl.org/dc/elements/1.1/description>>
> ?property_description . }**
> **    FILTER ((?property) != (<http://www.w3.org/2002/07/**
> owl#bottomObjectProperty<http://www.w3.org/2002/07/owl#bottomObjectProperty>
> >))**
> **    FILTER ((?range) != (<http://www.w3.org/2002/07/**owl#Nothing<http://www.w3.org/2002/07/owl#Nothing>
> >))**
> **    FILTER (! (BOUND(?somesub)))**
> **} *
>
> I checked this version of the serialized query on the reasoner powered
> graph that raised the problem and it worked fine.
>
> Il 08/12/2012 17:54, Reto Bachmann-Gmür ha scritto:
>
>  Ok, so you're suggesting not to change any interface but simly the
>> implemenentation to preserve the order, if the order has no relevane by
>> the
>> sparql spec then I would prefer that solution.
>>
>> Cheers,
>> Reto
>>
>> On Sat, Dec 8, 2012 at 5:42 PM, Giuseppe Miscione <
>> g.miscione@**innovationengineering.eu<g....@innovationengineering.eu>>
>> wrote:
>>
>>  Hi Reto,
>>> in revision 1353713 SimpleBasicGraphPattern contains this code:
>>>
>>> public SimpleBasicGraphPattern(Set<****TriplePattern> triplePatterns) {
>>>      this.triplePatterns = (triplePatterns == null)
>>>      ? new HashSet<TriplePattern>()
>>>      : triplePatterns;
>>> }
>>>
>>> This implementation uses an HashSet that will mess up the order of the
>>> added elements. By simply allocating a LinkedHashSet you'll keep the Set
>>> logic (no duplicates) and you'll preserve the order in which the elements
>>> are added to the set. BasicGraphPattern won't be affected at all, it will
>>> continue to espose a Set, but the underlying LinkedHashSet implementation
>>> will keep the order of the triple patterns.
>>> I don't know why Sets were used before (maybe to avoid the presence of a
>>> duplicate triple pattern in the same graph pattern?), but the solution
>>> implemented by Hasan completely changed the interface of
>>> BasicGraphPattern
>>> , deprecating a method and adding an equivalent one.
>>>
>>> Il 08/12/2012 17:13, Reto Bachmann-Gmür ha scritto:
>>>
>>>  Hi Giuseppe and Hasan
>>>>
>>>> If the order of the order of patter is relevant then this should model
>>>> this
>>>> as a list. Using LinkeddHashSet in BasicGraphPattern would tie this to a
>>>> particular implementation. As far as I know the order of the clauses has
>>>> no
>>>> relevance by the sparql spec (like the order of triples in a graph). But
>>>> we
>>>> could maybe change our implementation so that it no longer supports
>>>> querying by queries described as object trees but only as string, the
>>>> parsing necessary for the fastlane could be limited to detecting the
>>>> type
>>>> of query (to parse the result in the right way) and the graphs agains
>>>> which
>>>> the query is directed.
>>>>
>>>> Cheers,
>>>> Reto
>>>>
>>>>
>>>> On Sat, Dec 8, 2012 at 3:45 PM, Giuseppe Miscione <
>>>> g.miscione@**innovationenginee**ring.eu<http://innovationengineering.eu>
>>>> <g....@innovationengineering.eu>
>>>> >>
>>>> wrote:
>>>>
>>>>   Hi Hasan,
>>>>
>>>>> I had a look at the code changes that you've made.
>>>>> I saw that you introduced in the parser produced objects methods that
>>>>> now
>>>>> works with Lists and you've deprecated the methods working with Sets.
>>>>> Now,
>>>>> I have a personal cosideration: wouldn't it be easier to restore the
>>>>> old
>>>>> code and use LinkedHashSets instead of HashSets, without changing so
>>>>> much
>>>>> the class interfaces with the introduction of deprecated methods?
>>>>>
>>>>> Il 08/12/2012 14:27, Hasan Hasan ha scritto:
>>>>>
>>>>>    Hi Giuseppe
>>>>>
>>>>>  I have resolved the issue
>>>>>> CLEREZZA-725<https://issues.******apache.org/jira/browse/******
>>>>>> CLEREZZA-725 <http://apache.org/jira/browse/****CLEREZZA-725><
>>>>>> http://apache.**org/jira/browse/**CLEREZZA-725<http://apache.org/jira/browse/**CLEREZZA-725>
>>>>>> **>
>>>>>> <https://issues.**apache.org/**jira/browse/**CLEREZZA-725<http://apache.org/jira/browse/**CLEREZZA-725>
>>>>>> <htt**ps://issues.apache.org/jira/**browse/CLEREZZA-725<https://issues.apache.org/jira/browse/CLEREZZA-725>
>>>>>> >
>>>>>> which
>>>>>> reflects the problem you raised.
>>>>>>
>>>>>> Kind regards
>>>>>> Hasan
>>>>>>
>>>>>> On Tue, Dec 4, 2012 at 11:34 PM, Hasan Hasan <ha...@trialox.org>
>>>>>> wrote:
>>>>>>
>>>>>>    Thanks Giuseppe
>>>>>>
>>>>>>  *
>>>>>>> *
>>>>>>> I'll try the test as soon as I have time during this week.
>>>>>>>
>>>>>>> Cheers
>>>>>>> Hasan
>>>>>>>
>>>>>>>
>>>>>>> On Mon, Dec 3, 2012 at 3:13 PM, Giuseppe Miscione <
>>>>>>> g.miscione@****innovationenginee**ring.eu<htt**
>>>>>>> p://innovationengineering.eu <http://innovationengineering.eu>>
>>>>>>> <g.miscione@**innovationengine**ering.eu<http://innovationengineering.eu>
>>>>>>> <g....@innovationengineering.eu>
>>>>>>> >
>>>>>>> wrote:
>>>>>>>
>>>>>>>    Hi Hasan,
>>>>>>>
>>>>>>>  I prepared a JUnit test method that clarifies the problem:
>>>>>>>>
>>>>>>>> @Test
>>>>>>>> public void testParseMultipleTimes() throws Exception {
>>>>>>>>        String queryString =
>>>>>>>>            "PREFIX mo: <http://www.tech-it-easy-**
>>>>>>>> project.eu/ontologies/market_********ontology.owl#<http://project.eu/ontologies/market_******ontology.owl#>
>>>>>>>> <http://**project.eu/ontologies/market_******ontology.owl#<http://project.eu/ontologies/market_****ontology.owl#>
>>>>>>>> >
>>>>>>>> <http://**project.eu/**ontologies/market_******ontology.owl#<http://project.eu/ontologies/market_****ontology.owl#>
>>>>>>>> <http://project.**eu/ontologies/market_****ontology.owl#<http://project.eu/ontologies/market_**ontology.owl#>
>>>>>>>> >
>>>>>>>> <http://www.**tech-it-easy-**p**roject.eu/**ontologies/**<http://project.eu/**ontologies/**>
>>>>>>>> market_ontology.**<http://**tech-it-easy-project.eu/****
>>>>>>>> ontologies/market_ontology.**<http://tech-it-easy-project.eu/**ontologies/market_ontology.**>
>>>>>>>> >
>>>>>>>>
>>>>>>>> owl#<http://www.tech-it-easy-****project.eu/ontologies/market_****<http://project.eu/ontologies/market_**>
>>>>>>>> ontology.owl#<http://www.tech-**it-easy-project.eu/ontologies/**
>>>>>>>> market_ontology.owl#<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>
>>>>>>>> >
>>>>>>>>
>>>>>>>>> \n"
>>>>>>>>> +
>>>>>>>>>
>>>>>>>>            "PREFIX list: <http://jena.hpl.hp.com/ARQ/********list#<http://jena.hpl.hp.com/ARQ/******list#>
>>>>>>>> <http://jena.hpl.hp.**com/ARQ/****list#<http://jena.hpl.hp.com/ARQ/****list#>
>>>>>>>> >
>>>>>>>> <http://jena.hpl.hp.**com/ARQ/****list#<http://jena.hpl.hp.**
>>>>>>>> com/ARQ/**list# <http://jena.hpl.hp.com/ARQ/**list#>>
>>>>>>>> <http://jena.hpl.hp.com/**ARQ/****list#<http://jena.hpl.hp.com/**ARQ/**list#>
>>>>>>>> <http://jena.hpl.hp.**com/**ARQ/list#<http://jena.hpl.hp.com/**ARQ/list#>
>>>>>>>> ><
>>>>>>>> http://jena.hpl.hp.com/ARQ/****list#<http://jena.hpl.hp.com/ARQ/**list#><
>>>>>>>> http://jena.hpl.hp.com/ARQ/**list#<http://jena.hpl.hp.com/ARQ/list#>
>>>>>>>> >
>>>>>>>>
>>>>>>>>> \n"
>>>>>>>>> +
>>>>>>>>>
>>>>>>>>            "PREFIX owl: <http://www.w3.org/2002/07/********owl#<http://www.w3.org/2002/07/******owl#>
>>>>>>>> <http://www.w3.org/**2002/07/****owl#<http://www.w3.org/2002/07/****owl#>
>>>>>>>> >
>>>>>>>> <http://www.w3.org/2002/**07/****owl#<http://www.w3.org/2002/**07/**owl#>
>>>>>>>> <http://www.w3.org/2002/**07/**owl#<http://www.w3.org/2002/07/**owl#>
>>>>>>>> >
>>>>>>>> <http://www.w3.org/2002/**07/****owl#<http://www.w3.org/2002/**07/**owl#>
>>>>>>>> <http://www.w3.org/2002/****07/owl#<http://www.w3.org/2002/**07/owl#>
>>>>>>>> ><
>>>>>>>> http://www.w3.org/2002/07/****owl#<http://www.w3.org/2002/07/**owl#><
>>>>>>>> http://www.w3.org/2002/07/**owl# <http://www.w3.org/2002/07/owl#>>
>>>>>>>>
>>>>>>>>> \n"
>>>>>>>>>>>
>>>>>>>>>> +
>>>>>>>>            "PREFIX rdf: <http://www.w3.org/1999/02/22-****<http://www.w3.org/1999/02/22-**>
>>>>>>>> ****rdf-syntax-ns# <http://www.w3.org/1999/02/22-**
>>>>>>>> ****rdf-syntax-ns#<http://www.w3.org/1999/02/22-****rdf-syntax-ns#>
>>>>>>>> ><
>>>>>>>> http://www.**w3.org/1999/02/**22-**rdf-**syntax-ns#<http://w3.org/1999/02/22-**rdf-**syntax-ns#>
>>>>>>>> <http://**www.w3.org/1999/02/22-**rdf-**syntax-ns#<http://www.w3.org/1999/02/22-**rdf-syntax-ns#>
>>>>>>>> >
>>>>>>>> <http://www.**w3.org/1999/02/****22-rdf-syntax-**ns#<http://w3.org/1999/02/**22-rdf-syntax-**ns#>
>>>>>>>> <http://**w3.org/1999/02/22-rdf-syntax-****ns#<http://w3.org/1999/02/22-rdf-syntax-**ns#>
>>>>>>>> >
>>>>>>>> <http://**www.w3.org/1999/02/**22-rdf-**syntax-ns#<http://www.w3.org/1999/02/22-rdf-**syntax-ns#>
>>>>>>>> <http://**www.w3.org/1999/02/22-rdf-**syntax-ns#<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>>>>>>>> >
>>>>>>>>
>>>>>>>>> \n"
>>>>>>>>> +
>>>>>>>>>
>>>>>>>>            "PREFIX rdfs: <http://www.w3.org/2000/01/*****
>>>>>>>> ***rdf-schema# <http://www.w3.org/2000/01/******rdf-schema#><
>>>>>>>> http://www.w3.**org/2000/01/****rdf-schema#<http://www.w3.org/2000/01/****rdf-schema#>
>>>>>>>> >
>>>>>>>> <http://www.w3.**org/2000/01/****rdf-schema#<http://www.w3.**
>>>>>>>> org/2000/01/**rdf-schema# <http://www.w3.org/2000/01/**rdf-schema#>
>>>>>>>> >
>>>>>>>> <http://www.w3.org/**2000/01/****rdf-schema#<http://www.w3.org/**2000/01/**rdf-schema#>
>>>>>>>> <http://www.w3.**org/**2000/01/rdf-schema#<http://www.w3.org/**2000/01/rdf-schema#>
>>>>>>>> >
>>>>>>>> <http://www.w3.org/**2000/01/**rdf-schema#<http://www.w3.org/**2000/01/rdf-schema#>
>>>>>>>> <http://www.w3.org/**2000/01/rdf-schema#<http://www.w3.org/2000/01/rdf-schema#>
>>>>>>>> >
>>>>>>>>
>>>>>>>>> \n"
>>>>>>>>> +
>>>>>>>>>
>>>>>>>>            "PREFIX dc: <http://purl.org/dc/elements/********1.1/<http://purl.org/dc/elements/******1.1/>
>>>>>>>> <http://purl.org/dc/**elements/****1.1/<http://purl.org/dc/elements/****1.1/>
>>>>>>>> >
>>>>>>>> <http://purl.org/dc/****elements/**1.1/<http://purl.org/dc/**elements/**1.1/>
>>>>>>>> <http://purl.**org/dc/elements/**1.1/<http://purl.org/dc/elements/**1.1/>
>>>>>>>> >
>>>>>>>> <http://purl.org/dc/******elements/1.1/<http://purl.org/dc/****elements/1.1/>
>>>>>>>> <http://purl.org/**dc/**elements/1.1/<http://purl.org/dc/**elements/1.1/>
>>>>>>>> ><
>>>>>>>> http://purl.org/dc/elements/****1.1/<http://purl.org/dc/elements/**1.1/><
>>>>>>>> http://purl.org/dc/elements/**1.1/<http://purl.org/dc/elements/1.1/>
>>>>>>>> >
>>>>>>>>   \n"
>>>>>>>>
>>>>>>>>> +
>>>>>>>>>
>>>>>>>>            "SELECT ?property ?range ?property_description
>>>>>>>> ?subproperty
>>>>>>>> ?subproperty_description\n" +
>>>>>>>>            "WHERE {\n" +
>>>>>>>>            "    ?property a owl:ObjectProperty .\n" +
>>>>>>>>            "    FILTER (?property != owl:bottomObjectProperty) .\n"
>>>>>>>> +
>>>>>>>>            "    {\n" +
>>>>>>>>            "        {\n" +
>>>>>>>>            "            ?property rdfs:domain ?superclass .\n" +
>>>>>>>>            "            mo:Company rdfs:subClassOf ?superclass .\n"
>>>>>>>> +
>>>>>>>>            "        }\n" +
>>>>>>>>            "        UNION\n" +
>>>>>>>>            "        {\n" +
>>>>>>>>            "            ?property rdfs:domain ?dunion .\n" +
>>>>>>>>            "            ?dunion owl:unionOf ?dlist .\n" +
>>>>>>>>            "            ?dlist list:member ?superclass .\n" +
>>>>>>>>            "            mo:Company rdfs:subClassOf ?superclass .\n"
>>>>>>>> +
>>>>>>>>            "        }\n" +
>>>>>>>>            "    }\n" +
>>>>>>>>            "    {\n" +
>>>>>>>>            "        {\n" +
>>>>>>>>            "            ?property rdfs:range ?superrange .\n" +
>>>>>>>>            "            ?range rdfs:subClassOf ?superrange .\n" +
>>>>>>>>            "            FILTER (!isBlank(?range)) .\n" +
>>>>>>>>            "        }\n" +
>>>>>>>>            "        UNION\n" +
>>>>>>>>            "        {\n" +
>>>>>>>>            "            ?property rdfs:range ?range .\n" +
>>>>>>>>            "            FILTER (!isBlank(?range)) .\n" +
>>>>>>>>            "        }\n" +
>>>>>>>>            "    } .\n" +
>>>>>>>>            "    FILTER (?range != owl:Nothing) .\n" +
>>>>>>>>            "    OPTIONAL { ?somesub rdfs:subClassOf ?range .
>>>>>>>> FILTER(?somesub
>>>>>>>> != owl:Nothing && ?somesub != ?range)}\n" +
>>>>>>>>            "    FILTER (!bound(?somesub)) .\n" +
>>>>>>>>            "    OPTIONAL {\n" +
>>>>>>>>            "        ?subproperty rdfs:subPropertyOf ?property .\n" +
>>>>>>>>            "        FILTER(?subproperty != owl:bottomObjectProperty
>>>>>>>> &&
>>>>>>>> ?subproperty != ?property)\n" +
>>>>>>>>            "        OPTIONAL { ?subproperty dc:description
>>>>>>>> ?subproperty_description . }\n" +
>>>>>>>>            "    }\n" +
>>>>>>>>            "    OPTIONAL { ?property dc:description
>>>>>>>> ?property_description
>>>>>>>> .
>>>>>>>> }\n" +
>>>>>>>>            "} ";
>>>>>>>>
>>>>>>>>        Query query1 = QueryParser.getInstance().********
>>>>>>>> parse(queryString);
>>>>>>>>        System.out.println(query1.********toString());
>>>>>>>>
>>>>>>>>        System.out.println("----------********-------------");
>>>>>>>>
>>>>>>>>        Thread.sleep(5000l);
>>>>>>>>
>>>>>>>>        Query query2 = QueryParser.getInstance().********
>>>>>>>> parse(queryString);
>>>>>>>>        System.out.println(query2.********toString());
>>>>>>>>
>>>>>>>>        Assert.assertEquals(query1.********toString(),
>>>>>>>> query2.toString());
>>>>>>>>
>>>>>>>> }
>>>>>>>>
>>>>>>>> By separating the two parse() calls with a 5 seconds sleep, you'll
>>>>>>>> see
>>>>>>>> that the two parsed objects will produce different strings. Without
>>>>>>>> the
>>>>>>>> Thread.sleep() call the test method doesn't fail, so I think there's
>>>>>>>> something time-related in the javacc parser that will mix up the
>>>>>>>> parsed
>>>>>>>> statements.
>>>>>>>>
>>>>>>>> Regards,
>>>>>>>> Giuseppe
>>>>>>>>
>>>>>>>> Il 03/12/2012 10:25, Giuseppe Miscione ha scritto:
>>>>>>>>
>>>>>>>>     Hi Hasan,
>>>>>>>>
>>>>>>>>   this is the query on which I was working:
>>>>>>>>
>>>>>>>>> PREFIX mo: <http://www.tech-it-easy-******pro**
>>>>>>>>> ject.eu/ontologies/market_** <http://project.eu/ontologies/****<http://project.eu/ontologies/**>
>>>>>>>>> market_** <http://project.eu/ontologies/**market_**<http://project.eu/ontologies/market_**>
>>>>>>>>> >>
>>>>>>>>> ontology.owl#<http://www.tech-******it-easy-project.eu/****
>>>>>>>>> ontologies/** <http://it-easy-project.eu/**ontologies/**><
>>>>>>>>> http://it-easy-**project.eu/ontologies/**<http://it-easy-project.eu/ontologies/**>
>>>>>>>>> >
>>>>>>>>> market_ontology.owl#<http://****www.tech-it-easy-project.eu/**<http://www.tech-it-easy-project.eu/**>
>>>>>>>>> ontologies/market_ontology.****owl#<http://www.tech-it-easy-**
>>>>>>>>> project.eu/ontologies/market_**ontology.owl#<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>
>>>>>>>>> >
>>>>>>>>> PREFIX list: <http://jena.hpl.hp.com/ARQ/********list#<http://jena.hpl.hp.com/ARQ/******list#>
>>>>>>>>> <http://jena.hpl.hp.**com/ARQ/****list#<http://jena.hpl.hp.com/ARQ/****list#>
>>>>>>>>> >
>>>>>>>>> <http://jena.hpl.hp.**com/ARQ/****list#<http://jena.hpl.hp.**
>>>>>>>>> com/ARQ/**list# <http://jena.hpl.hp.com/ARQ/**list#>>
>>>>>>>>> <http://jena.hpl.hp.com/**ARQ/****list#<http://jena.hpl.hp.com/**ARQ/**list#>
>>>>>>>>> <http://jena.hpl.hp.**com/**ARQ/list#<http://jena.hpl.hp.com/**ARQ/list#>
>>>>>>>>> ><
>>>>>>>>> http://jena.hpl.hp.com/ARQ/****list#<http://jena.hpl.hp.com/ARQ/**list#>
>>>>>>>>> <http://jena.hpl.hp.com/**ARQ/list#<http://jena.hpl.hp.com/ARQ/list#>
>>>>>>>>> >
>>>>>>>>> PREFIX owl: <http://www.w3.org/2002/07/********owl#<http://www.w3.org/2002/07/******owl#>
>>>>>>>>> <http://www.w3.org/**2002/07/****owl#<http://www.w3.org/2002/07/****owl#>
>>>>>>>>> >
>>>>>>>>> <http://www.w3.org/2002/**07/****owl#<http://www.w3.org/2002/**07/**owl#>
>>>>>>>>> <http://www.w3.org/2002/**07/**owl#<http://www.w3.org/2002/07/**owl#>
>>>>>>>>> >
>>>>>>>>> <http://www.w3.org/2002/**07/****owl#<http://www.w3.org/2002/**07/**owl#>
>>>>>>>>> <http://www.w3.org/2002/****07/owl#<http://www.w3.org/2002/**07/owl#>
>>>>>>>>> ><
>>>>>>>>> http://www.w3.org/2002/07/****owl#<http://www.w3.org/2002/07/**owl#><
>>>>>>>>> http://www.w3.org/2002/07/**owl# <http://www.w3.org/2002/07/owl#>
>>>>>>>>> >>>
>>>>>>>>> PREFIX rdf: <http://www.w3.org/1999/02/22-********rdf-syntax-ns#<http://www.w3.org/1999/02/22-******rdf-syntax-ns#>
>>>>>>>>> <http://**www.w3.org/1999/02/22-****rdf-**syntax-ns#<http://www.w3.org/1999/02/22-****rdf-syntax-ns#>
>>>>>>>>> >
>>>>>>>>> <http://www.**w3.org/1999/02/**22-**rdf-**syntax-ns#<http://w3.org/1999/02/22-**rdf-**syntax-ns#>
>>>>>>>>> <http://**www.w3.org/1999/02/22-**rdf-**syntax-ns#<http://www.w3.org/1999/02/22-**rdf-syntax-ns#>
>>>>>>>>> >
>>>>>>>>> <http://www.**w3.org/1999/02/****22-rdf-syntax-**ns#<http://w3.org/1999/02/**22-rdf-syntax-**ns#>
>>>>>>>>> <http://**w3.org/1999/02/22-rdf-syntax-****ns#<http://w3.org/1999/02/22-rdf-syntax-**ns#>
>>>>>>>>> >
>>>>>>>>> <http://**www.w3.org/1999/02/**22-rdf-**syntax-ns#<http://www.w3.org/1999/02/22-rdf-**syntax-ns#>
>>>>>>>>> <http://**www.w3.org/1999/02/22-rdf-**syntax-ns#<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>>>>>>>>> >
>>>>>>>>> PREFIX rdfs: <http://www.w3.org/2000/01/********rdf-schema#<http://www.w3.org/2000/01/******rdf-schema#>
>>>>>>>>> <http://www.w3.**org/2000/01/****rdf-schema#<http://www.w3.org/2000/01/****rdf-schema#>
>>>>>>>>> >
>>>>>>>>> <http://www.w3.**org/2000/01/****rdf-schema#<http://www.w3.**
>>>>>>>>> org/2000/01/**rdf-schema#<http://www.w3.org/2000/01/**rdf-schema#>
>>>>>>>>> >
>>>>>>>>> <http://www.w3.org/**2000/01/****rdf-schema#<http://www.w3.org/**2000/01/**rdf-schema#>
>>>>>>>>> <http://www.w3.**org/**2000/01/rdf-schema#<http://www.w3.org/**2000/01/rdf-schema#>
>>>>>>>>> >
>>>>>>>>> <http://www.w3.org/**2000/01/**rdf-schema#<http://www.w3.org/**2000/01/rdf-schema#>
>>>>>>>>> <http://www.w3.org/**2000/01/rdf-schema#<http://www.w3.org/2000/01/rdf-schema#>
>>>>>>>>> >
>>>>>>>>> PREFIX dc: <http://purl.org/dc/elements/********1.1/<http://purl.org/dc/elements/******1.1/>
>>>>>>>>> <http://purl.org/dc/**elements/****1.1/<http://purl.org/dc/elements/****1.1/>
>>>>>>>>> >
>>>>>>>>> <http://purl.org/dc/****elements/**1.1/<http://purl.org/dc/**elements/**1.1/>
>>>>>>>>> <http://purl.**org/dc/elements/**1.1/<http://purl.org/dc/elements/**1.1/>
>>>>>>>>> >
>>>>>>>>> <http://purl.org/dc/******elements/1.1/<http://purl.org/dc/****elements/1.1/>
>>>>>>>>> <http://purl.org/**dc/**elements/1.1/<http://purl.org/dc/**elements/1.1/>
>>>>>>>>> ><
>>>>>>>>> http://purl.org/dc/elements/****1.1/<http://purl.org/dc/elements/**1.1/>
>>>>>>>>> <http://purl.org/dc/**elements/1.1/<http://purl.org/dc/elements/1.1/>
>>>>>>>>> >
>>>>>>>>> SELECT ?property ?range ?property_description ?subproperty
>>>>>>>>> ?subproperty_description
>>>>>>>>> WHERE {
>>>>>>>>>        ?property a owl:ObjectProperty .
>>>>>>>>>        FILTER (?property != owl:bottomObjectProperty) .
>>>>>>>>>        {
>>>>>>>>>            {
>>>>>>>>>                ?property rdfs:domain ?superclass .
>>>>>>>>>                mo:Company rdfs:subClassOf ?superclass .
>>>>>>>>>            }
>>>>>>>>>            UNION
>>>>>>>>>            {
>>>>>>>>>                ?property rdfs:domain ?dunion .
>>>>>>>>>                ?dunion owl:unionOf ?dlist .
>>>>>>>>>                ?dlist list:member ?superclass .
>>>>>>>>>                mo:Company rdfs:subClassOf ?superclass .
>>>>>>>>>            }
>>>>>>>>>        }
>>>>>>>>>        {
>>>>>>>>>            {
>>>>>>>>>                ?property rdfs:range ?superrange .
>>>>>>>>>                ?range rdfs:subClassOf ?superrange .
>>>>>>>>>                FILTER (!isBlank(?range)) .
>>>>>>>>>            }
>>>>>>>>>            UNION
>>>>>>>>>            {
>>>>>>>>>                ?property rdfs:range ?range .
>>>>>>>>>                FILTER (!isBlank(?range)) .
>>>>>>>>>            }
>>>>>>>>>        } .
>>>>>>>>>        FILTER (?range != owl:Nothing) .
>>>>>>>>>        OPTIONAL { ?somesub rdfs:subClassOf ?range .
>>>>>>>>> FILTER(?somesub !=
>>>>>>>>> owl:Nothing && ?somesub != ?range)}
>>>>>>>>>        FILTER (!bound(?somesub)) .
>>>>>>>>>        OPTIONAL {
>>>>>>>>>            ?subproperty rdfs:subPropertyOf ?property .
>>>>>>>>>            FILTER(?subproperty != owl:bottomObjectProperty &&
>>>>>>>>> ?subproperty
>>>>>>>>> != ?property)
>>>>>>>>>            OPTIONAL { ?subproperty dc:description
>>>>>>>>> ?subproperty_description
>>>>>>>>> . }
>>>>>>>>>        }
>>>>>>>>>        OPTIONAL { ?property dc:description ?property_description .
>>>>>>>>> }
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>> Il 03/12/2012 07:53, Hasan Hasan ha scritto:
>>>>>>>>>
>>>>>>>>>    Hi Giuseppe
>>>>>>>>>
>>>>>>>>>  can you please provide an example of the query that you use and
>>>>>>>>>> that I
>>>>>>>>>> can
>>>>>>>>>> reproduce easily?
>>>>>>>>>> I will try to take some time this week to have a look.
>>>>>>>>>>
>>>>>>>>>> Kind regards
>>>>>>>>>> Hasan
>>>>>>>>>>
>>>>>>>>>> On Fri, Nov 30, 2012 at 5:36 PM, Giuseppe Miscione <
>>>>>>>>>> g.miscione@******innovationenginee**ring.eu<**htt**
>>>>>>>>>> p://innovationengineering.eu <http://innovationengineering.**eu<http://innovationengineering.eu>
>>>>>>>>>> >>
>>>>>>>>>>
>>>>>>>>>> <g.miscione@****innovationengine**ering.eu<htt**
>>>>>>>>>> p://innovationengineering.eu <http://innovationengineering.eu>>
>>>>>>>>>> <g.miscione@**innovationengine**ering.eu<http://innovationengineering.eu>
>>>>>>>>>> <g....@innovationengineering.eu>
>>>>>>>>>> >
>>>>>>>>>> wrote:
>>>>>>>>>>
>>>>>>>>>>     Hi all,
>>>>>>>>>>
>>>>>>>>>>   I found a bug in the SPARQL query execution chain, specifically
>>>>>>>>>> in
>>>>>>>>>>
>>>>>>>>>>> the
>>>>>>>>>>> *org.apache.clerezza.rdf.core.**********sparql.query.Query*
>>>>>>>>>>> objects
>>>>>>>>>>>
>>>>>>>>>>> serialization
>>>>>>>>>>> made with the *org.apache.clerezza.rdf.core.******
>>>>>>>>>>> ****sparql.query.impl.****
>>>>>>>>>>> SimpleStringQuerySerializer*
>>>>>>>>>>> methods.
>>>>>>>>>>> The problem comes from the fact that the javacc objects used for
>>>>>>>>>>> mapping
>>>>>>>>>>> triple patterns are not listed in the same order as in the
>>>>>>>>>>> original
>>>>>>>>>>> query
>>>>>>>>>>> string. *SimpleStringQuerySerializer* serializes patterns into
>>>>>>>>>>> the
>>>>>>>>>>> ouput
>>>>>>>>>>> string in the order returned by the javacc parser, and so the
>>>>>>>>>>> output
>>>>>>>>>>> string
>>>>>>>>>>> won't always be equivalent to the source one. Moreover, parsing
>>>>>>>>>>> multiple
>>>>>>>>>>> times the same query string will result in different output
>>>>>>>>>>> strings.
>>>>>>>>>>>
>>>>>>>>>>> This problem is even more annoying when executing (like in my
>>>>>>>>>>> case)
>>>>>>>>>>> queries on graphs enanched with Pellet reasoner, because it has
>>>>>>>>>>> obviuos
>>>>>>>>>>> difficulties in inferencing relations if the order of triple
>>>>>>>>>>> patterns
>>>>>>>>>>> in
>>>>>>>>>>> the query is not the provided one.
>>>>>>>>>>>
>>>>>>>>>>> I solved the problem in my environment by simply saving the
>>>>>>>>>>> original
>>>>>>>>>>> string into the parsed *Query *object and then making
>>>>>>>>>>> *SimpleStringQuerySerializer* returns this string, without any
>>>>>>>>>>> processing.
>>>>>>>>>>>
>>>>>>>>>>> Can anyone take a look at the serializer to find a maybe better
>>>>>>>>>>> solution
>>>>>>>>>>> to avoid this weird behaviour?
>>>>>>>>>>>
>>>>>>>>>>> Regards,
>>>>>>>>>>> Giuseppe Miscione
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>

Re: Bug in SPARQL query serialization

Posted by Giuseppe Miscione <g....@innovationengineering.eu>.
Exactly, I was suggestion only to allocate LinkedHashSets instead of 
HashSets.
I tried this solution on my code version, using LinkedHashSets in this 
classes:

  * org.apache.clerezza.rdf.core.sparql.query.impl.SimpleBasicGraphPattern
  * org.apache.clerezza.rdf.core.sparql.query.impl.SimpleConstructQuery
  * org.apache.clerezza.rdf.core.sparql.query.impl.SimpleDataSet
  * org.apache.clerezza.rdf.core.sparql.query.impl.SimpleGroupGraphPattern

And the test case that I suggested doesn't fail anymore. On the other 
side, I checked the generated strings and the FILTER and OPTIONAL 
sentences are not in the original order. This is the original query:

*PREFIX mo: 
<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>**
**PREFIX list: <http://jena.hpl.hp.com/ARQ/list#>**
**PREFIX owl: <http://www.w3.org/2002/07/owl#>**
**PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>**
**PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>**
**PREFIX dc: <http://purl.org/dc/elements/1.1/>**
**SELECT ?property ?range ?property_description ?subproperty 
?subproperty_description**
**WHERE**
**{**
**    ?property a owl:ObjectProperty .**
**    FILTER (?property != owl:bottomObjectProperty) .**
**    {**
**        {**
**            ?property rdfs:domain ?superclass .**
**            mo:Company rdfs:subClassOf ?superclass .**
**        }**
**        UNION**
**        {**
**            ?property rdfs:domain ?dunion .**
**            ?dunion owl:unionOf ?dlist .**
**            ?dlist list:member ?superclass .**
**            mo:Company rdfs:subClassOf ?superclass .**
**        }**
**    }**
**    {**
**        {**
**            ?property rdfs:range ?superrange .**
**            ?range rdfs:subClassOf ?superrange .**
**            FILTER (!isBlank(?range)) .**
**        }**
**        UNION**
**        {**
**            ?property rdfs:range ?range .**
**            FILTER (!isBlank(?range)) .**
**        }**
**    } .**
**    FILTER (?range != owl:Nothing) .**
**    OPTIONAL { ?somesub rdfs:subClassOf ?range . FILTER(?somesub != 
owl:Nothing && ?somesub != ?range)}**
**    FILTER (!bound(?somesub)) .**
**    OPTIONAL**
**    {**
**        ?subproperty rdfs:subPropertyOf ?property .**
**        FILTER(?subproperty != owl:bottomObjectProperty && 
?subproperty != ?property)**
**        OPTIONAL { ?subproperty dc:description 
?subproperty_description . }**
**    }**
**    OPTIONAL { ?property dc:description ?property_description . }**
**} *

And this is the serialized string:

*SELECT ?property ?range ?property_description ?subproperty 
?subproperty_description **
**WHERE**
**{**
**    ?property <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .**
**    {**
**        {**
**            ?property <http://www.w3.org/2000/01/rdf-schema#domain> 
?superclass .**
**<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#Company> 
<http://www.w3.org/2000/01/rdf-schema#subClassOf> ?superclass .**
**        } **
**        UNION**
**        {**
**            ?property <http://www.w3.org/2000/01/rdf-schema#domain> 
?dunion .**
**            ?dunion <http://www.w3.org/2002/07/owl#unionOf> ?dlist .**
**            ?dlist <http://jena.hpl.hp.com/ARQ/list#member> 
?superclass .**
**<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#Company> 
<http://www.w3.org/2000/01/rdf-schema#subClassOf> ?superclass .**
**        }**
**    }**
**    {**
**        {**
**            ?property <http://www.w3.org/2000/01/rdf-schema#range> 
?superrange .**
**            ?range <http://www.w3.org/2000/01/rdf-schema#subClassOf> 
?superrange .**
**            FILTER (! (isBLANK(?range)))**
**        }**
**        UNION**
**        {**
**            ?property <http://www.w3.org/2000/01/rdf-schema#range> 
?range .**
**            FILTER (! (isBLANK(?range)))**
**        }**
**    }**
**    OPTIONAL**
**    {**
**        ?somesub <http://www.w3.org/2000/01/rdf-schema#subClassOf> 
?range .**
**        FILTER (((?somesub) != 
(<http://www.w3.org/2002/07/owl#Nothing>)) && ((?somesub) != (?range)))**
**    }**
**    OPTIONAL**
**    {**
**        ?subproperty 
<http://www.w3.org/2000/01/rdf-schema#subPropertyOf> ?property .**
**        OPTIONAL { ?subproperty 
<http://purl.org/dc/elements/1.1/description> ?subproperty_description . }**
**        FILTER (((?subproperty) != 
(<http://www.w3.org/2002/07/owl#bottomObjectProperty>)) && 
((?subproperty) != (?property)))**
**    }**
**    OPTIONAL { ?property <http://purl.org/dc/elements/1.1/description> 
?property_description . }**
**    FILTER ((?property) != 
(<http://www.w3.org/2002/07/owl#bottomObjectProperty>))**
**    FILTER ((?range) != (<http://www.w3.org/2002/07/owl#Nothing>))**
**    FILTER (! (BOUND(?somesub)))**
**} *

I checked this version of the serialized query on the reasoner powered 
graph that raised the problem and it worked fine.

Il 08/12/2012 17:54, Reto Bachmann-Gmür ha scritto:
> Ok, so you're suggesting not to change any interface but simly the
> implemenentation to preserve the order, if the order has no relevane by the
> sparql spec then I would prefer that solution.
>
> Cheers,
> Reto
>
> On Sat, Dec 8, 2012 at 5:42 PM, Giuseppe Miscione <
> g.miscione@innovationengineering.eu> wrote:
>
>> Hi Reto,
>> in revision 1353713 SimpleBasicGraphPattern contains this code:
>>
>> public SimpleBasicGraphPattern(Set<**TriplePattern> triplePatterns) {
>>      this.triplePatterns = (triplePatterns == null)
>>      ? new HashSet<TriplePattern>()
>>      : triplePatterns;
>> }
>>
>> This implementation uses an HashSet that will mess up the order of the
>> added elements. By simply allocating a LinkedHashSet you'll keep the Set
>> logic (no duplicates) and you'll preserve the order in which the elements
>> are added to the set. BasicGraphPattern won't be affected at all, it will
>> continue to espose a Set, but the underlying LinkedHashSet implementation
>> will keep the order of the triple patterns.
>> I don't know why Sets were used before (maybe to avoid the presence of a
>> duplicate triple pattern in the same graph pattern?), but the solution
>> implemented by Hasan completely changed the interface of BasicGraphPattern
>> , deprecating a method and adding an equivalent one.
>>
>> Il 08/12/2012 17:13, Reto Bachmann-Gmür ha scritto:
>>
>>> Hi Giuseppe and Hasan
>>>
>>> If the order of the order of patter is relevant then this should model
>>> this
>>> as a list. Using LinkeddHashSet in BasicGraphPattern would tie this to a
>>> particular implementation. As far as I know the order of the clauses has
>>> no
>>> relevance by the sparql spec (like the order of triples in a graph). But
>>> we
>>> could maybe change our implementation so that it no longer supports
>>> querying by queries described as object trees but only as string, the
>>> parsing necessary for the fastlane could be limited to detecting the type
>>> of query (to parse the result in the right way) and the graphs agains
>>> which
>>> the query is directed.
>>>
>>> Cheers,
>>> Reto
>>>
>>>
>>> On Sat, Dec 8, 2012 at 3:45 PM, Giuseppe Miscione <
>>> g.miscione@**innovationengineering.eu<g....@innovationengineering.eu>>
>>> wrote:
>>>
>>>   Hi Hasan,
>>>> I had a look at the code changes that you've made.
>>>> I saw that you introduced in the parser produced objects methods that now
>>>> works with Lists and you've deprecated the methods working with Sets.
>>>> Now,
>>>> I have a personal cosideration: wouldn't it be easier to restore the old
>>>> code and use LinkedHashSets instead of HashSets, without changing so much
>>>> the class interfaces with the introduction of deprecated methods?
>>>>
>>>> Il 08/12/2012 14:27, Hasan Hasan ha scritto:
>>>>
>>>>    Hi Giuseppe
>>>>
>>>>> I have resolved the issue
>>>>> CLEREZZA-725<https://issues.****apache.org/jira/browse/****CLEREZZA-725<http://apache.org/jira/browse/**CLEREZZA-725>
>>>>> <https://issues.**apache.org/jira/browse/**CLEREZZA-725<https://issues.apache.org/jira/browse/CLEREZZA-725>
>>>>> which
>>>>> reflects the problem you raised.
>>>>>
>>>>> Kind regards
>>>>> Hasan
>>>>>
>>>>> On Tue, Dec 4, 2012 at 11:34 PM, Hasan Hasan <ha...@trialox.org> wrote:
>>>>>
>>>>>    Thanks Giuseppe
>>>>>
>>>>>> *
>>>>>> *
>>>>>> I'll try the test as soon as I have time during this week.
>>>>>>
>>>>>> Cheers
>>>>>> Hasan
>>>>>>
>>>>>>
>>>>>> On Mon, Dec 3, 2012 at 3:13 PM, Giuseppe Miscione <
>>>>>> g.miscione@**innovationenginee**ring.eu<http://innovationengineering.eu>
>>>>>> <g....@innovationengineering.eu>
>>>>>> wrote:
>>>>>>
>>>>>>    Hi Hasan,
>>>>>>
>>>>>>> I prepared a JUnit test method that clarifies the problem:
>>>>>>>
>>>>>>> @Test
>>>>>>> public void testParseMultipleTimes() throws Exception {
>>>>>>>        String queryString =
>>>>>>>            "PREFIX mo: <http://www.tech-it-easy-**
>>>>>>> project.eu/ontologies/market_******ontology.owl#<http://project.eu/ontologies/market_****ontology.owl#>
>>>>>>> <http://**project.eu/ontologies/market_****ontology.owl#<http://project.eu/ontologies/market_**ontology.owl#>
>>>>>>> <http://www.**tech-it-easy-**project.eu/**ontologies/**
>>>>>>> market_ontology.**<http://tech-it-easy-project.eu/**ontologies/market_ontology.**>
>>>>>>>
>>>>>>> owl#<http://www.tech-it-easy-**project.eu/ontologies/market_**
>>>>>>> ontology.owl#<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>
>>>>>>>> \n"
>>>>>>>> +
>>>>>>>            "PREFIX list: <http://jena.hpl.hp.com/ARQ/******list#<http://jena.hpl.hp.com/ARQ/****list#>
>>>>>>> <http://jena.hpl.hp.**com/ARQ/**list#<http://jena.hpl.hp.com/ARQ/**list#>
>>>>>>> <http://jena.hpl.hp.com/**ARQ/**list#<http://jena.hpl.hp.com/**ARQ/list#><
>>>>>>> http://jena.hpl.hp.com/ARQ/**list# <http://jena.hpl.hp.com/ARQ/list#>
>>>>>>>> \n"
>>>>>>>> +
>>>>>>>            "PREFIX owl: <http://www.w3.org/2002/07/******owl#<http://www.w3.org/2002/07/****owl#>
>>>>>>> <http://www.w3.org/2002/**07/**owl#<http://www.w3.org/2002/07/**owl#>
>>>>>>> <http://www.w3.org/2002/**07/**owl#<http://www.w3.org/2002/**07/owl#><
>>>>>>> http://www.w3.org/2002/07/**owl# <http://www.w3.org/2002/07/owl#>
>>>>>>>>>> \n"
>>>>>>> +
>>>>>>>            "PREFIX rdf: <http://www.w3.org/1999/02/22-**
>>>>>>> ****rdf-syntax-ns# <http://www.w3.org/1999/02/22-****rdf-syntax-ns#><
>>>>>>> http://www.**w3.org/1999/02/22-**rdf-**syntax-ns#<http://www.w3.org/1999/02/22-**rdf-syntax-ns#>
>>>>>>> <http://www.**w3.org/1999/02/**22-rdf-syntax-**ns#<http://w3.org/1999/02/22-rdf-syntax-**ns#>
>>>>>>> <http://**www.w3.org/1999/02/22-rdf-**syntax-ns#<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>>>>>>>> \n"
>>>>>>>> +
>>>>>>>            "PREFIX rdfs: <http://www.w3.org/2000/01/******rdf-schema#<http://www.w3.org/2000/01/****rdf-schema#>
>>>>>>> <http://www.w3.**org/2000/01/**rdf-schema#<http://www.w3.org/2000/01/**rdf-schema#>
>>>>>>> <http://www.w3.org/**2000/01/**rdf-schema#<http://www.w3.org/**2000/01/rdf-schema#>
>>>>>>> <http://www.w3.org/**2000/01/rdf-schema#<http://www.w3.org/2000/01/rdf-schema#>
>>>>>>>> \n"
>>>>>>>> +
>>>>>>>            "PREFIX dc: <http://purl.org/dc/elements/******1.1/<http://purl.org/dc/elements/****1.1/>
>>>>>>> <http://purl.org/dc/**elements/**1.1/<http://purl.org/dc/elements/**1.1/>
>>>>>>> <http://purl.org/dc/****elements/1.1/<http://purl.org/dc/**elements/1.1/><
>>>>>>> http://purl.org/dc/elements/**1.1/ <http://purl.org/dc/elements/1.1/>
>>>>>>>   \n"
>>>>>>>> +
>>>>>>>            "SELECT ?property ?range ?property_description ?subproperty
>>>>>>> ?subproperty_description\n" +
>>>>>>>            "WHERE {\n" +
>>>>>>>            "    ?property a owl:ObjectProperty .\n" +
>>>>>>>            "    FILTER (?property != owl:bottomObjectProperty) .\n" +
>>>>>>>            "    {\n" +
>>>>>>>            "        {\n" +
>>>>>>>            "            ?property rdfs:domain ?superclass .\n" +
>>>>>>>            "            mo:Company rdfs:subClassOf ?superclass .\n" +
>>>>>>>            "        }\n" +
>>>>>>>            "        UNION\n" +
>>>>>>>            "        {\n" +
>>>>>>>            "            ?property rdfs:domain ?dunion .\n" +
>>>>>>>            "            ?dunion owl:unionOf ?dlist .\n" +
>>>>>>>            "            ?dlist list:member ?superclass .\n" +
>>>>>>>            "            mo:Company rdfs:subClassOf ?superclass .\n" +
>>>>>>>            "        }\n" +
>>>>>>>            "    }\n" +
>>>>>>>            "    {\n" +
>>>>>>>            "        {\n" +
>>>>>>>            "            ?property rdfs:range ?superrange .\n" +
>>>>>>>            "            ?range rdfs:subClassOf ?superrange .\n" +
>>>>>>>            "            FILTER (!isBlank(?range)) .\n" +
>>>>>>>            "        }\n" +
>>>>>>>            "        UNION\n" +
>>>>>>>            "        {\n" +
>>>>>>>            "            ?property rdfs:range ?range .\n" +
>>>>>>>            "            FILTER (!isBlank(?range)) .\n" +
>>>>>>>            "        }\n" +
>>>>>>>            "    } .\n" +
>>>>>>>            "    FILTER (?range != owl:Nothing) .\n" +
>>>>>>>            "    OPTIONAL { ?somesub rdfs:subClassOf ?range .
>>>>>>> FILTER(?somesub
>>>>>>> != owl:Nothing && ?somesub != ?range)}\n" +
>>>>>>>            "    FILTER (!bound(?somesub)) .\n" +
>>>>>>>            "    OPTIONAL {\n" +
>>>>>>>            "        ?subproperty rdfs:subPropertyOf ?property .\n" +
>>>>>>>            "        FILTER(?subproperty != owl:bottomObjectProperty &&
>>>>>>> ?subproperty != ?property)\n" +
>>>>>>>            "        OPTIONAL { ?subproperty dc:description
>>>>>>> ?subproperty_description . }\n" +
>>>>>>>            "    }\n" +
>>>>>>>            "    OPTIONAL { ?property dc:description
>>>>>>> ?property_description
>>>>>>> .
>>>>>>> }\n" +
>>>>>>>            "} ";
>>>>>>>
>>>>>>>        Query query1 = QueryParser.getInstance().******
>>>>>>> parse(queryString);
>>>>>>>        System.out.println(query1.******toString());
>>>>>>>
>>>>>>>        System.out.println("----------******-------------");
>>>>>>>
>>>>>>>        Thread.sleep(5000l);
>>>>>>>
>>>>>>>        Query query2 = QueryParser.getInstance().******
>>>>>>> parse(queryString);
>>>>>>>        System.out.println(query2.******toString());
>>>>>>>
>>>>>>>        Assert.assertEquals(query1.******toString(),
>>>>>>> query2.toString());
>>>>>>>
>>>>>>> }
>>>>>>>
>>>>>>> By separating the two parse() calls with a 5 seconds sleep, you'll see
>>>>>>> that the two parsed objects will produce different strings. Without
>>>>>>> the
>>>>>>> Thread.sleep() call the test method doesn't fail, so I think there's
>>>>>>> something time-related in the javacc parser that will mix up the
>>>>>>> parsed
>>>>>>> statements.
>>>>>>>
>>>>>>> Regards,
>>>>>>> Giuseppe
>>>>>>>
>>>>>>> Il 03/12/2012 10:25, Giuseppe Miscione ha scritto:
>>>>>>>
>>>>>>>     Hi Hasan,
>>>>>>>
>>>>>>>   this is the query on which I was working:
>>>>>>>> PREFIX mo: <http://www.tech-it-easy-****pro**
>>>>>>>> ject.eu/ontologies/market_** <http://project.eu/ontologies/**
>>>>>>>> market_** <http://project.eu/ontologies/market_**>>
>>>>>>>> ontology.owl#<http://www.tech-****it-easy-project.eu/**ontologies/**<http://it-easy-project.eu/ontologies/**>
>>>>>>>> market_ontology.owl#<http://**www.tech-it-easy-project.eu/**
>>>>>>>> ontologies/market_ontology.**owl#<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>
>>>>>>>> PREFIX list: <http://jena.hpl.hp.com/ARQ/******list#<http://jena.hpl.hp.com/ARQ/****list#>
>>>>>>>> <http://jena.hpl.hp.**com/ARQ/**list#<http://jena.hpl.hp.com/ARQ/**list#>
>>>>>>>> <http://jena.hpl.hp.com/**ARQ/**list#<http://jena.hpl.hp.com/**ARQ/list#><
>>>>>>>> http://jena.hpl.hp.com/ARQ/**list#<http://jena.hpl.hp.com/ARQ/list#>
>>>>>>>> PREFIX owl: <http://www.w3.org/2002/07/******owl#<http://www.w3.org/2002/07/****owl#>
>>>>>>>> <http://www.w3.org/2002/**07/**owl#<http://www.w3.org/2002/07/**owl#>
>>>>>>>> <http://www.w3.org/2002/**07/**owl#<http://www.w3.org/2002/**07/owl#><
>>>>>>>> http://www.w3.org/2002/07/**owl# <http://www.w3.org/2002/07/owl#>>>
>>>>>>>> PREFIX rdf: <http://www.w3.org/1999/02/22-******rdf-syntax-ns#<http://www.w3.org/1999/02/22-****rdf-syntax-ns#>
>>>>>>>> <http://www.**w3.org/1999/02/22-**rdf-**syntax-ns#<http://www.w3.org/1999/02/22-**rdf-syntax-ns#>
>>>>>>>> <http://www.**w3.org/1999/02/**22-rdf-syntax-**ns#<http://w3.org/1999/02/22-rdf-syntax-**ns#>
>>>>>>>> <http://**www.w3.org/1999/02/22-rdf-**syntax-ns#<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>>>>>>>> PREFIX rdfs: <http://www.w3.org/2000/01/******rdf-schema#<http://www.w3.org/2000/01/****rdf-schema#>
>>>>>>>> <http://www.w3.**org/2000/01/**rdf-schema#<http://www.w3.org/2000/01/**rdf-schema#>
>>>>>>>> <http://www.w3.org/**2000/01/**rdf-schema#<http://www.w3.org/**2000/01/rdf-schema#>
>>>>>>>> <http://www.w3.org/**2000/01/rdf-schema#<http://www.w3.org/2000/01/rdf-schema#>
>>>>>>>> PREFIX dc: <http://purl.org/dc/elements/******1.1/<http://purl.org/dc/elements/****1.1/>
>>>>>>>> <http://purl.org/dc/**elements/**1.1/<http://purl.org/dc/elements/**1.1/>
>>>>>>>> <http://purl.org/dc/****elements/1.1/<http://purl.org/dc/**elements/1.1/><
>>>>>>>> http://purl.org/dc/elements/**1.1/<http://purl.org/dc/elements/1.1/>
>>>>>>>> SELECT ?property ?range ?property_description ?subproperty
>>>>>>>> ?subproperty_description
>>>>>>>> WHERE {
>>>>>>>>        ?property a owl:ObjectProperty .
>>>>>>>>        FILTER (?property != owl:bottomObjectProperty) .
>>>>>>>>        {
>>>>>>>>            {
>>>>>>>>                ?property rdfs:domain ?superclass .
>>>>>>>>                mo:Company rdfs:subClassOf ?superclass .
>>>>>>>>            }
>>>>>>>>            UNION
>>>>>>>>            {
>>>>>>>>                ?property rdfs:domain ?dunion .
>>>>>>>>                ?dunion owl:unionOf ?dlist .
>>>>>>>>                ?dlist list:member ?superclass .
>>>>>>>>                mo:Company rdfs:subClassOf ?superclass .
>>>>>>>>            }
>>>>>>>>        }
>>>>>>>>        {
>>>>>>>>            {
>>>>>>>>                ?property rdfs:range ?superrange .
>>>>>>>>                ?range rdfs:subClassOf ?superrange .
>>>>>>>>                FILTER (!isBlank(?range)) .
>>>>>>>>            }
>>>>>>>>            UNION
>>>>>>>>            {
>>>>>>>>                ?property rdfs:range ?range .
>>>>>>>>                FILTER (!isBlank(?range)) .
>>>>>>>>            }
>>>>>>>>        } .
>>>>>>>>        FILTER (?range != owl:Nothing) .
>>>>>>>>        OPTIONAL { ?somesub rdfs:subClassOf ?range . FILTER(?somesub !=
>>>>>>>> owl:Nothing && ?somesub != ?range)}
>>>>>>>>        FILTER (!bound(?somesub)) .
>>>>>>>>        OPTIONAL {
>>>>>>>>            ?subproperty rdfs:subPropertyOf ?property .
>>>>>>>>            FILTER(?subproperty != owl:bottomObjectProperty &&
>>>>>>>> ?subproperty
>>>>>>>> != ?property)
>>>>>>>>            OPTIONAL { ?subproperty dc:description
>>>>>>>> ?subproperty_description
>>>>>>>> . }
>>>>>>>>        }
>>>>>>>>        OPTIONAL { ?property dc:description ?property_description . }
>>>>>>>> }
>>>>>>>>
>>>>>>>> Il 03/12/2012 07:53, Hasan Hasan ha scritto:
>>>>>>>>
>>>>>>>>    Hi Giuseppe
>>>>>>>>
>>>>>>>>> can you please provide an example of the query that you use and
>>>>>>>>> that I
>>>>>>>>> can
>>>>>>>>> reproduce easily?
>>>>>>>>> I will try to take some time this week to have a look.
>>>>>>>>>
>>>>>>>>> Kind regards
>>>>>>>>> Hasan
>>>>>>>>>
>>>>>>>>> On Fri, Nov 30, 2012 at 5:36 PM, Giuseppe Miscione <
>>>>>>>>> g.miscione@****innovationenginee**ring.eu<htt**
>>>>>>>>> p://innovationengineering.eu <http://innovationengineering.eu>>
>>>>>>>>>
>>>>>>>>> <g.miscione@**innovationengine**ering.eu<http://innovationengineering.eu>
>>>>>>>>> <g....@innovationengineering.eu>
>>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>>     Hi all,
>>>>>>>>>
>>>>>>>>>   I found a bug in the SPARQL query execution chain, specifically in
>>>>>>>>>> the
>>>>>>>>>> *org.apache.clerezza.rdf.core.********sparql.query.Query* objects
>>>>>>>>>>
>>>>>>>>>> serialization
>>>>>>>>>> made with the *org.apache.clerezza.rdf.core.****
>>>>>>>>>> ****sparql.query.impl.****
>>>>>>>>>> SimpleStringQuerySerializer*
>>>>>>>>>> methods.
>>>>>>>>>> The problem comes from the fact that the javacc objects used for
>>>>>>>>>> mapping
>>>>>>>>>> triple patterns are not listed in the same order as in the original
>>>>>>>>>> query
>>>>>>>>>> string. *SimpleStringQuerySerializer* serializes patterns into the
>>>>>>>>>> ouput
>>>>>>>>>> string in the order returned by the javacc parser, and so the
>>>>>>>>>> output
>>>>>>>>>> string
>>>>>>>>>> won't always be equivalent to the source one. Moreover, parsing
>>>>>>>>>> multiple
>>>>>>>>>> times the same query string will result in different output
>>>>>>>>>> strings.
>>>>>>>>>>
>>>>>>>>>> This problem is even more annoying when executing (like in my case)
>>>>>>>>>> queries on graphs enanched with Pellet reasoner, because it has
>>>>>>>>>> obviuos
>>>>>>>>>> difficulties in inferencing relations if the order of triple
>>>>>>>>>> patterns
>>>>>>>>>> in
>>>>>>>>>> the query is not the provided one.
>>>>>>>>>>
>>>>>>>>>> I solved the problem in my environment by simply saving the
>>>>>>>>>> original
>>>>>>>>>> string into the parsed *Query *object and then making
>>>>>>>>>> *SimpleStringQuerySerializer* returns this string, without any
>>>>>>>>>> processing.
>>>>>>>>>>
>>>>>>>>>> Can anyone take a look at the serializer to find a maybe better
>>>>>>>>>> solution
>>>>>>>>>> to avoid this weird behaviour?
>>>>>>>>>>
>>>>>>>>>> Regards,
>>>>>>>>>> Giuseppe Miscione
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>


Re: Bug in SPARQL query serialization

Posted by Reto Bachmann-Gmür <re...@wymiwyg.com>.
Ok, so you're suggesting not to change any interface but simly the
implemenentation to preserve the order, if the order has no relevane by the
sparql spec then I would prefer that solution.

Cheers,
Reto

On Sat, Dec 8, 2012 at 5:42 PM, Giuseppe Miscione <
g.miscione@innovationengineering.eu> wrote:

> Hi Reto,
> in revision 1353713 SimpleBasicGraphPattern contains this code:
>
> public SimpleBasicGraphPattern(Set<**TriplePattern> triplePatterns) {
>     this.triplePatterns = (triplePatterns == null)
>     ? new HashSet<TriplePattern>()
>     : triplePatterns;
> }
>
> This implementation uses an HashSet that will mess up the order of the
> added elements. By simply allocating a LinkedHashSet you'll keep the Set
> logic (no duplicates) and you'll preserve the order in which the elements
> are added to the set. BasicGraphPattern won't be affected at all, it will
> continue to espose a Set, but the underlying LinkedHashSet implementation
> will keep the order of the triple patterns.
> I don't know why Sets were used before (maybe to avoid the presence of a
> duplicate triple pattern in the same graph pattern?), but the solution
> implemented by Hasan completely changed the interface of BasicGraphPattern
> , deprecating a method and adding an equivalent one.
>
> Il 08/12/2012 17:13, Reto Bachmann-Gmür ha scritto:
>
>> Hi Giuseppe and Hasan
>>
>> If the order of the order of patter is relevant then this should model
>> this
>> as a list. Using LinkeddHashSet in BasicGraphPattern would tie this to a
>> particular implementation. As far as I know the order of the clauses has
>> no
>> relevance by the sparql spec (like the order of triples in a graph). But
>> we
>> could maybe change our implementation so that it no longer supports
>> querying by queries described as object trees but only as string, the
>> parsing necessary for the fastlane could be limited to detecting the type
>> of query (to parse the result in the right way) and the graphs agains
>> which
>> the query is directed.
>>
>> Cheers,
>> Reto
>>
>>
>> On Sat, Dec 8, 2012 at 3:45 PM, Giuseppe Miscione <
>> g.miscione@**innovationengineering.eu<g....@innovationengineering.eu>>
>> wrote:
>>
>>  Hi Hasan,
>>> I had a look at the code changes that you've made.
>>> I saw that you introduced in the parser produced objects methods that now
>>> works with Lists and you've deprecated the methods working with Sets.
>>> Now,
>>> I have a personal cosideration: wouldn't it be easier to restore the old
>>> code and use LinkedHashSets instead of HashSets, without changing so much
>>> the class interfaces with the introduction of deprecated methods?
>>>
>>> Il 08/12/2012 14:27, Hasan Hasan ha scritto:
>>>
>>>   Hi Giuseppe
>>>
>>>> I have resolved the issue
>>>> CLEREZZA-725<https://issues.****apache.org/jira/browse/****CLEREZZA-725<http://apache.org/jira/browse/**CLEREZZA-725>
>>>> <https://issues.**apache.org/jira/browse/**CLEREZZA-725<https://issues.apache.org/jira/browse/CLEREZZA-725>
>>>> >>
>>>>
>>>> which
>>>> reflects the problem you raised.
>>>>
>>>> Kind regards
>>>> Hasan
>>>>
>>>> On Tue, Dec 4, 2012 at 11:34 PM, Hasan Hasan <ha...@trialox.org> wrote:
>>>>
>>>>   Thanks Giuseppe
>>>>
>>>>> *
>>>>> *
>>>>> I'll try the test as soon as I have time during this week.
>>>>>
>>>>> Cheers
>>>>> Hasan
>>>>>
>>>>>
>>>>> On Mon, Dec 3, 2012 at 3:13 PM, Giuseppe Miscione <
>>>>> g.miscione@**innovationenginee**ring.eu<http://innovationengineering.eu>
>>>>> <g....@innovationengineering.eu>
>>>>> >>
>>>>> wrote:
>>>>>
>>>>>   Hi Hasan,
>>>>>
>>>>>> I prepared a JUnit test method that clarifies the problem:
>>>>>>
>>>>>> @Test
>>>>>> public void testParseMultipleTimes() throws Exception {
>>>>>>       String queryString =
>>>>>>           "PREFIX mo: <http://www.tech-it-easy-**
>>>>>> project.eu/ontologies/market_******ontology.owl#<http://project.eu/ontologies/market_****ontology.owl#>
>>>>>> <http://**project.eu/ontologies/market_****ontology.owl#<http://project.eu/ontologies/market_**ontology.owl#>
>>>>>> >
>>>>>> <http://www.**tech-it-easy-**project.eu/**ontologies/**
>>>>>> market_ontology.**<http://tech-it-easy-project.eu/**ontologies/market_ontology.**>
>>>>>>
>>>>>> owl#<http://www.tech-it-easy-**project.eu/ontologies/market_**
>>>>>> ontology.owl#<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>
>>>>>> >
>>>>>>
>>>>>>> \n"
>>>>>>>>
>>>>>>> +
>>>>>>           "PREFIX list: <http://jena.hpl.hp.com/ARQ/******list#<http://jena.hpl.hp.com/ARQ/****list#>
>>>>>> <http://jena.hpl.hp.**com/ARQ/**list#<http://jena.hpl.hp.com/ARQ/**list#>
>>>>>> >
>>>>>> <http://jena.hpl.hp.com/**ARQ/**list#<http://jena.hpl.hp.com/**ARQ/list#><
>>>>>> http://jena.hpl.hp.com/ARQ/**list# <http://jena.hpl.hp.com/ARQ/list#>
>>>>>> >
>>>>>>
>>>>>>> \n"
>>>>>>>>
>>>>>>> +
>>>>>>           "PREFIX owl: <http://www.w3.org/2002/07/******owl#<http://www.w3.org/2002/07/****owl#>
>>>>>> <http://www.w3.org/2002/**07/**owl#<http://www.w3.org/2002/07/**owl#>
>>>>>> >
>>>>>> <http://www.w3.org/2002/**07/**owl#<http://www.w3.org/2002/**07/owl#><
>>>>>> http://www.w3.org/2002/07/**owl# <http://www.w3.org/2002/07/owl#>
>>>>>> >>>\n"
>>>>>> +
>>>>>>           "PREFIX rdf: <http://www.w3.org/1999/02/22-**
>>>>>> ****rdf-syntax-ns# <http://www.w3.org/1999/02/22-****rdf-syntax-ns#><
>>>>>> http://www.**w3.org/1999/02/22-**rdf-**syntax-ns#<http://www.w3.org/1999/02/22-**rdf-syntax-ns#>
>>>>>> >
>>>>>> <http://www.**w3.org/1999/02/**22-rdf-syntax-**ns#<http://w3.org/1999/02/22-rdf-syntax-**ns#>
>>>>>> <http://**www.w3.org/1999/02/22-rdf-**syntax-ns#<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>>>>>> >
>>>>>>
>>>>>>> \n"
>>>>>>>>
>>>>>>> +
>>>>>>           "PREFIX rdfs: <http://www.w3.org/2000/01/******rdf-schema#<http://www.w3.org/2000/01/****rdf-schema#>
>>>>>> <http://www.w3.**org/2000/01/**rdf-schema#<http://www.w3.org/2000/01/**rdf-schema#>
>>>>>> >
>>>>>> <http://www.w3.org/**2000/01/**rdf-schema#<http://www.w3.org/**2000/01/rdf-schema#>
>>>>>> <http://www.w3.org/**2000/01/rdf-schema#<http://www.w3.org/2000/01/rdf-schema#>
>>>>>> >
>>>>>>
>>>>>>> \n"
>>>>>>>>
>>>>>>> +
>>>>>>           "PREFIX dc: <http://purl.org/dc/elements/******1.1/<http://purl.org/dc/elements/****1.1/>
>>>>>> <http://purl.org/dc/**elements/**1.1/<http://purl.org/dc/elements/**1.1/>
>>>>>> >
>>>>>> <http://purl.org/dc/****elements/1.1/<http://purl.org/dc/**elements/1.1/><
>>>>>> http://purl.org/dc/elements/**1.1/ <http://purl.org/dc/elements/1.1/>
>>>>>> >
>>>>>>
>>>>>>  \n"
>>>>>>>>
>>>>>>> +
>>>>>>           "SELECT ?property ?range ?property_description ?subproperty
>>>>>> ?subproperty_description\n" +
>>>>>>           "WHERE {\n" +
>>>>>>           "    ?property a owl:ObjectProperty .\n" +
>>>>>>           "    FILTER (?property != owl:bottomObjectProperty) .\n" +
>>>>>>           "    {\n" +
>>>>>>           "        {\n" +
>>>>>>           "            ?property rdfs:domain ?superclass .\n" +
>>>>>>           "            mo:Company rdfs:subClassOf ?superclass .\n" +
>>>>>>           "        }\n" +
>>>>>>           "        UNION\n" +
>>>>>>           "        {\n" +
>>>>>>           "            ?property rdfs:domain ?dunion .\n" +
>>>>>>           "            ?dunion owl:unionOf ?dlist .\n" +
>>>>>>           "            ?dlist list:member ?superclass .\n" +
>>>>>>           "            mo:Company rdfs:subClassOf ?superclass .\n" +
>>>>>>           "        }\n" +
>>>>>>           "    }\n" +
>>>>>>           "    {\n" +
>>>>>>           "        {\n" +
>>>>>>           "            ?property rdfs:range ?superrange .\n" +
>>>>>>           "            ?range rdfs:subClassOf ?superrange .\n" +
>>>>>>           "            FILTER (!isBlank(?range)) .\n" +
>>>>>>           "        }\n" +
>>>>>>           "        UNION\n" +
>>>>>>           "        {\n" +
>>>>>>           "            ?property rdfs:range ?range .\n" +
>>>>>>           "            FILTER (!isBlank(?range)) .\n" +
>>>>>>           "        }\n" +
>>>>>>           "    } .\n" +
>>>>>>           "    FILTER (?range != owl:Nothing) .\n" +
>>>>>>           "    OPTIONAL { ?somesub rdfs:subClassOf ?range .
>>>>>> FILTER(?somesub
>>>>>> != owl:Nothing && ?somesub != ?range)}\n" +
>>>>>>           "    FILTER (!bound(?somesub)) .\n" +
>>>>>>           "    OPTIONAL {\n" +
>>>>>>           "        ?subproperty rdfs:subPropertyOf ?property .\n" +
>>>>>>           "        FILTER(?subproperty != owl:bottomObjectProperty &&
>>>>>> ?subproperty != ?property)\n" +
>>>>>>           "        OPTIONAL { ?subproperty dc:description
>>>>>> ?subproperty_description . }\n" +
>>>>>>           "    }\n" +
>>>>>>           "    OPTIONAL { ?property dc:description
>>>>>> ?property_description
>>>>>> .
>>>>>> }\n" +
>>>>>>           "} ";
>>>>>>
>>>>>>       Query query1 = QueryParser.getInstance().******
>>>>>> parse(queryString);
>>>>>>       System.out.println(query1.******toString());
>>>>>>
>>>>>>       System.out.println("----------******-------------");
>>>>>>
>>>>>>       Thread.sleep(5000l);
>>>>>>
>>>>>>       Query query2 = QueryParser.getInstance().******
>>>>>> parse(queryString);
>>>>>>       System.out.println(query2.******toString());
>>>>>>
>>>>>>       Assert.assertEquals(query1.******toString(),
>>>>>> query2.toString());
>>>>>>
>>>>>> }
>>>>>>
>>>>>> By separating the two parse() calls with a 5 seconds sleep, you'll see
>>>>>> that the two parsed objects will produce different strings. Without
>>>>>> the
>>>>>> Thread.sleep() call the test method doesn't fail, so I think there's
>>>>>> something time-related in the javacc parser that will mix up the
>>>>>> parsed
>>>>>> statements.
>>>>>>
>>>>>> Regards,
>>>>>> Giuseppe
>>>>>>
>>>>>> Il 03/12/2012 10:25, Giuseppe Miscione ha scritto:
>>>>>>
>>>>>>    Hi Hasan,
>>>>>>
>>>>>>  this is the query on which I was working:
>>>>>>>
>>>>>>> PREFIX mo: <http://www.tech-it-easy-****pro**
>>>>>>> ject.eu/ontologies/market_** <http://project.eu/ontologies/**
>>>>>>> market_** <http://project.eu/ontologies/market_**>>
>>>>>>> ontology.owl#<http://www.tech-****it-easy-project.eu/**ontologies/**<http://it-easy-project.eu/ontologies/**>
>>>>>>> market_ontology.owl#<http://**www.tech-it-easy-project.eu/**
>>>>>>> ontologies/market_ontology.**owl#<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>
>>>>>>> >
>>>>>>> PREFIX list: <http://jena.hpl.hp.com/ARQ/******list#<http://jena.hpl.hp.com/ARQ/****list#>
>>>>>>> <http://jena.hpl.hp.**com/ARQ/**list#<http://jena.hpl.hp.com/ARQ/**list#>
>>>>>>> >
>>>>>>> <http://jena.hpl.hp.com/**ARQ/**list#<http://jena.hpl.hp.com/**ARQ/list#><
>>>>>>> http://jena.hpl.hp.com/ARQ/**list#<http://jena.hpl.hp.com/ARQ/list#>
>>>>>>> >
>>>>>>> PREFIX owl: <http://www.w3.org/2002/07/******owl#<http://www.w3.org/2002/07/****owl#>
>>>>>>> <http://www.w3.org/2002/**07/**owl#<http://www.w3.org/2002/07/**owl#>
>>>>>>> >
>>>>>>> <http://www.w3.org/2002/**07/**owl#<http://www.w3.org/2002/**07/owl#><
>>>>>>> http://www.w3.org/2002/07/**owl# <http://www.w3.org/2002/07/owl#>>>
>>>>>>> PREFIX rdf: <http://www.w3.org/1999/02/22-******rdf-syntax-ns#<http://www.w3.org/1999/02/22-****rdf-syntax-ns#>
>>>>>>> <http://www.**w3.org/1999/02/22-**rdf-**syntax-ns#<http://www.w3.org/1999/02/22-**rdf-syntax-ns#>
>>>>>>> >
>>>>>>> <http://www.**w3.org/1999/02/**22-rdf-syntax-**ns#<http://w3.org/1999/02/22-rdf-syntax-**ns#>
>>>>>>> <http://**www.w3.org/1999/02/22-rdf-**syntax-ns#<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>>>>>>> >
>>>>>>> PREFIX rdfs: <http://www.w3.org/2000/01/******rdf-schema#<http://www.w3.org/2000/01/****rdf-schema#>
>>>>>>> <http://www.w3.**org/2000/01/**rdf-schema#<http://www.w3.org/2000/01/**rdf-schema#>
>>>>>>> >
>>>>>>> <http://www.w3.org/**2000/01/**rdf-schema#<http://www.w3.org/**2000/01/rdf-schema#>
>>>>>>> <http://www.w3.org/**2000/01/rdf-schema#<http://www.w3.org/2000/01/rdf-schema#>
>>>>>>> >
>>>>>>> PREFIX dc: <http://purl.org/dc/elements/******1.1/<http://purl.org/dc/elements/****1.1/>
>>>>>>> <http://purl.org/dc/**elements/**1.1/<http://purl.org/dc/elements/**1.1/>
>>>>>>> >
>>>>>>> <http://purl.org/dc/****elements/1.1/<http://purl.org/dc/**elements/1.1/><
>>>>>>> http://purl.org/dc/elements/**1.1/<http://purl.org/dc/elements/1.1/>
>>>>>>> >
>>>>>>>
>>>>>>> SELECT ?property ?range ?property_description ?subproperty
>>>>>>> ?subproperty_description
>>>>>>> WHERE {
>>>>>>>       ?property a owl:ObjectProperty .
>>>>>>>       FILTER (?property != owl:bottomObjectProperty) .
>>>>>>>       {
>>>>>>>           {
>>>>>>>               ?property rdfs:domain ?superclass .
>>>>>>>               mo:Company rdfs:subClassOf ?superclass .
>>>>>>>           }
>>>>>>>           UNION
>>>>>>>           {
>>>>>>>               ?property rdfs:domain ?dunion .
>>>>>>>               ?dunion owl:unionOf ?dlist .
>>>>>>>               ?dlist list:member ?superclass .
>>>>>>>               mo:Company rdfs:subClassOf ?superclass .
>>>>>>>           }
>>>>>>>       }
>>>>>>>       {
>>>>>>>           {
>>>>>>>               ?property rdfs:range ?superrange .
>>>>>>>               ?range rdfs:subClassOf ?superrange .
>>>>>>>               FILTER (!isBlank(?range)) .
>>>>>>>           }
>>>>>>>           UNION
>>>>>>>           {
>>>>>>>               ?property rdfs:range ?range .
>>>>>>>               FILTER (!isBlank(?range)) .
>>>>>>>           }
>>>>>>>       } .
>>>>>>>       FILTER (?range != owl:Nothing) .
>>>>>>>       OPTIONAL { ?somesub rdfs:subClassOf ?range . FILTER(?somesub !=
>>>>>>> owl:Nothing && ?somesub != ?range)}
>>>>>>>       FILTER (!bound(?somesub)) .
>>>>>>>       OPTIONAL {
>>>>>>>           ?subproperty rdfs:subPropertyOf ?property .
>>>>>>>           FILTER(?subproperty != owl:bottomObjectProperty &&
>>>>>>> ?subproperty
>>>>>>> != ?property)
>>>>>>>           OPTIONAL { ?subproperty dc:description
>>>>>>> ?subproperty_description
>>>>>>> . }
>>>>>>>       }
>>>>>>>       OPTIONAL { ?property dc:description ?property_description . }
>>>>>>> }
>>>>>>>
>>>>>>> Il 03/12/2012 07:53, Hasan Hasan ha scritto:
>>>>>>>
>>>>>>>   Hi Giuseppe
>>>>>>>
>>>>>>>> can you please provide an example of the query that you use and
>>>>>>>> that I
>>>>>>>> can
>>>>>>>> reproduce easily?
>>>>>>>> I will try to take some time this week to have a look.
>>>>>>>>
>>>>>>>> Kind regards
>>>>>>>> Hasan
>>>>>>>>
>>>>>>>> On Fri, Nov 30, 2012 at 5:36 PM, Giuseppe Miscione <
>>>>>>>> g.miscione@****innovationenginee**ring.eu<htt**
>>>>>>>> p://innovationengineering.eu <http://innovationengineering.eu>>
>>>>>>>>
>>>>>>>> <g.miscione@**innovationengine**ering.eu<http://innovationengineering.eu>
>>>>>>>> <g....@innovationengineering.eu>
>>>>>>>> >
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>    Hi all,
>>>>>>>>
>>>>>>>>  I found a bug in the SPARQL query execution chain, specifically in
>>>>>>>>> the
>>>>>>>>> *org.apache.clerezza.rdf.core.********sparql.query.Query* objects
>>>>>>>>>
>>>>>>>>> serialization
>>>>>>>>> made with the *org.apache.clerezza.rdf.core.****
>>>>>>>>> ****sparql.query.impl.****
>>>>>>>>> SimpleStringQuerySerializer*
>>>>>>>>> methods.
>>>>>>>>> The problem comes from the fact that the javacc objects used for
>>>>>>>>> mapping
>>>>>>>>> triple patterns are not listed in the same order as in the original
>>>>>>>>> query
>>>>>>>>> string. *SimpleStringQuerySerializer* serializes patterns into the
>>>>>>>>> ouput
>>>>>>>>> string in the order returned by the javacc parser, and so the
>>>>>>>>> output
>>>>>>>>> string
>>>>>>>>> won't always be equivalent to the source one. Moreover, parsing
>>>>>>>>> multiple
>>>>>>>>> times the same query string will result in different output
>>>>>>>>> strings.
>>>>>>>>>
>>>>>>>>> This problem is even more annoying when executing (like in my case)
>>>>>>>>> queries on graphs enanched with Pellet reasoner, because it has
>>>>>>>>> obviuos
>>>>>>>>> difficulties in inferencing relations if the order of triple
>>>>>>>>> patterns
>>>>>>>>> in
>>>>>>>>> the query is not the provided one.
>>>>>>>>>
>>>>>>>>> I solved the problem in my environment by simply saving the
>>>>>>>>> original
>>>>>>>>> string into the parsed *Query *object and then making
>>>>>>>>> *SimpleStringQuerySerializer* returns this string, without any
>>>>>>>>> processing.
>>>>>>>>>
>>>>>>>>> Can anyone take a look at the serializer to find a maybe better
>>>>>>>>> solution
>>>>>>>>> to avoid this weird behaviour?
>>>>>>>>>
>>>>>>>>> Regards,
>>>>>>>>> Giuseppe Miscione
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>

Re: Bug in SPARQL query serialization

Posted by Giuseppe Miscione <g....@innovationengineering.eu>.
Hi Reto,
in revision 1353713 SimpleBasicGraphPattern contains this code:

public SimpleBasicGraphPattern(Set<TriplePattern> triplePatterns) {
     this.triplePatterns = (triplePatterns == null)
     ? new HashSet<TriplePattern>()
     : triplePatterns;
}

This implementation uses an HashSet that will mess up the order of the 
added elements. By simply allocating a LinkedHashSet you'll keep the Set 
logic (no duplicates) and you'll preserve the order in which the 
elements are added to the set. BasicGraphPattern won't be affected at 
all, it will continue to espose a Set, but the underlying LinkedHashSet 
implementation will keep the order of the triple patterns.
I don't know why Sets were used before (maybe to avoid the presence of a 
duplicate triple pattern in the same graph pattern?), but the solution 
implemented by Hasan completely changed the interface of 
BasicGraphPattern , deprecating a method and adding an equivalent one.

Il 08/12/2012 17:13, Reto Bachmann-Gmür ha scritto:
> Hi Giuseppe and Hasan
>
> If the order of the order of patter is relevant then this should model this
> as a list. Using LinkeddHashSet in BasicGraphPattern would tie this to a
> particular implementation. As far as I know the order of the clauses has no
> relevance by the sparql spec (like the order of triples in a graph). But we
> could maybe change our implementation so that it no longer supports
> querying by queries described as object trees but only as string, the
> parsing necessary for the fastlane could be limited to detecting the type
> of query (to parse the result in the right way) and the graphs agains which
> the query is directed.
>
> Cheers,
> Reto
>
>
> On Sat, Dec 8, 2012 at 3:45 PM, Giuseppe Miscione <
> g.miscione@innovationengineering.eu> wrote:
>
>> Hi Hasan,
>> I had a look at the code changes that you've made.
>> I saw that you introduced in the parser produced objects methods that now
>> works with Lists and you've deprecated the methods working with Sets. Now,
>> I have a personal cosideration: wouldn't it be easier to restore the old
>> code and use LinkedHashSets instead of HashSets, without changing so much
>> the class interfaces with the introduction of deprecated methods?
>>
>> Il 08/12/2012 14:27, Hasan Hasan ha scritto:
>>
>>   Hi Giuseppe
>>> I have resolved the issue
>>> CLEREZZA-725<https://issues.**apache.org/jira/browse/**CLEREZZA-725<https://issues.apache.org/jira/browse/CLEREZZA-725>>
>>> which
>>> reflects the problem you raised.
>>>
>>> Kind regards
>>> Hasan
>>>
>>> On Tue, Dec 4, 2012 at 11:34 PM, Hasan Hasan <ha...@trialox.org> wrote:
>>>
>>>   Thanks Giuseppe
>>>> *
>>>> *
>>>> I'll try the test as soon as I have time during this week.
>>>>
>>>> Cheers
>>>> Hasan
>>>>
>>>>
>>>> On Mon, Dec 3, 2012 at 3:13 PM, Giuseppe Miscione <
>>>> g.miscione@**innovationengineering.eu<g....@innovationengineering.eu>>
>>>> wrote:
>>>>
>>>>   Hi Hasan,
>>>>> I prepared a JUnit test method that clarifies the problem:
>>>>>
>>>>> @Test
>>>>> public void testParseMultipleTimes() throws Exception {
>>>>>       String queryString =
>>>>>           "PREFIX mo: <http://www.tech-it-easy-**
>>>>> project.eu/ontologies/market_****ontology.owl#<http://project.eu/ontologies/market_**ontology.owl#>
>>>>> <http://www.**tech-it-easy-project.eu/**ontologies/market_ontology.**
>>>>> owl#<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>
>>>>>>> \n"
>>>>> +
>>>>>           "PREFIX list: <http://jena.hpl.hp.com/ARQ/****list#<http://jena.hpl.hp.com/ARQ/**list#>
>>>>> <http://jena.hpl.hp.com/**ARQ/list# <http://jena.hpl.hp.com/ARQ/list#>
>>>>>>> \n"
>>>>> +
>>>>>           "PREFIX owl: <http://www.w3.org/2002/07/****owl#<http://www.w3.org/2002/07/**owl#>
>>>>> <http://www.w3.org/2002/**07/owl# <http://www.w3.org/2002/07/owl#>>>\n"
>>>>> +
>>>>>           "PREFIX rdf: <http://www.w3.org/1999/02/22-****rdf-syntax-ns#<http://www.w3.org/1999/02/22-**rdf-syntax-ns#>
>>>>> <http://www.**w3.org/1999/02/22-rdf-syntax-**ns#<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>>>>>>> \n"
>>>>> +
>>>>>           "PREFIX rdfs: <http://www.w3.org/2000/01/****rdf-schema#<http://www.w3.org/2000/01/**rdf-schema#>
>>>>> <http://www.w3.org/**2000/01/rdf-schema#<http://www.w3.org/2000/01/rdf-schema#>
>>>>>>> \n"
>>>>> +
>>>>>           "PREFIX dc: <http://purl.org/dc/elements/****1.1/<http://purl.org/dc/elements/**1.1/>
>>>>> <http://purl.org/dc/**elements/1.1/ <http://purl.org/dc/elements/1.1/>
>>>>>>> \n"
>>>>> +
>>>>>           "SELECT ?property ?range ?property_description ?subproperty
>>>>> ?subproperty_description\n" +
>>>>>           "WHERE {\n" +
>>>>>           "    ?property a owl:ObjectProperty .\n" +
>>>>>           "    FILTER (?property != owl:bottomObjectProperty) .\n" +
>>>>>           "    {\n" +
>>>>>           "        {\n" +
>>>>>           "            ?property rdfs:domain ?superclass .\n" +
>>>>>           "            mo:Company rdfs:subClassOf ?superclass .\n" +
>>>>>           "        }\n" +
>>>>>           "        UNION\n" +
>>>>>           "        {\n" +
>>>>>           "            ?property rdfs:domain ?dunion .\n" +
>>>>>           "            ?dunion owl:unionOf ?dlist .\n" +
>>>>>           "            ?dlist list:member ?superclass .\n" +
>>>>>           "            mo:Company rdfs:subClassOf ?superclass .\n" +
>>>>>           "        }\n" +
>>>>>           "    }\n" +
>>>>>           "    {\n" +
>>>>>           "        {\n" +
>>>>>           "            ?property rdfs:range ?superrange .\n" +
>>>>>           "            ?range rdfs:subClassOf ?superrange .\n" +
>>>>>           "            FILTER (!isBlank(?range)) .\n" +
>>>>>           "        }\n" +
>>>>>           "        UNION\n" +
>>>>>           "        {\n" +
>>>>>           "            ?property rdfs:range ?range .\n" +
>>>>>           "            FILTER (!isBlank(?range)) .\n" +
>>>>>           "        }\n" +
>>>>>           "    } .\n" +
>>>>>           "    FILTER (?range != owl:Nothing) .\n" +
>>>>>           "    OPTIONAL { ?somesub rdfs:subClassOf ?range .
>>>>> FILTER(?somesub
>>>>> != owl:Nothing && ?somesub != ?range)}\n" +
>>>>>           "    FILTER (!bound(?somesub)) .\n" +
>>>>>           "    OPTIONAL {\n" +
>>>>>           "        ?subproperty rdfs:subPropertyOf ?property .\n" +
>>>>>           "        FILTER(?subproperty != owl:bottomObjectProperty &&
>>>>> ?subproperty != ?property)\n" +
>>>>>           "        OPTIONAL { ?subproperty dc:description
>>>>> ?subproperty_description . }\n" +
>>>>>           "    }\n" +
>>>>>           "    OPTIONAL { ?property dc:description ?property_description
>>>>> .
>>>>> }\n" +
>>>>>           "} ";
>>>>>
>>>>>       Query query1 = QueryParser.getInstance().****parse(queryString);
>>>>>       System.out.println(query1.****toString());
>>>>>
>>>>>       System.out.println("----------****-------------");
>>>>>
>>>>>       Thread.sleep(5000l);
>>>>>
>>>>>       Query query2 = QueryParser.getInstance().****parse(queryString);
>>>>>       System.out.println(query2.****toString());
>>>>>
>>>>>       Assert.assertEquals(query1.****toString(), query2.toString());
>>>>> }
>>>>>
>>>>> By separating the two parse() calls with a 5 seconds sleep, you'll see
>>>>> that the two parsed objects will produce different strings. Without the
>>>>> Thread.sleep() call the test method doesn't fail, so I think there's
>>>>> something time-related in the javacc parser that will mix up the parsed
>>>>> statements.
>>>>>
>>>>> Regards,
>>>>> Giuseppe
>>>>>
>>>>> Il 03/12/2012 10:25, Giuseppe Miscione ha scritto:
>>>>>
>>>>>    Hi Hasan,
>>>>>
>>>>>> this is the query on which I was working:
>>>>>>
>>>>>> PREFIX mo: <http://www.tech-it-easy-**pro**
>>>>>> ject.eu/ontologies/market_** <http://project.eu/ontologies/market_**>
>>>>>> ontology.owl#<http://www.tech-**it-easy-project.eu/ontologies/**
>>>>>> market_ontology.owl#<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>
>>>>>> PREFIX list: <http://jena.hpl.hp.com/ARQ/****list#<http://jena.hpl.hp.com/ARQ/**list#>
>>>>>> <http://jena.hpl.hp.com/**ARQ/list# <http://jena.hpl.hp.com/ARQ/list#>
>>>>>> PREFIX owl: <http://www.w3.org/2002/07/****owl#<http://www.w3.org/2002/07/**owl#>
>>>>>> <http://www.w3.org/2002/**07/owl# <http://www.w3.org/2002/07/owl#>>
>>>>>> PREFIX rdf: <http://www.w3.org/1999/02/22-****rdf-syntax-ns#<http://www.w3.org/1999/02/22-**rdf-syntax-ns#>
>>>>>> <http://www.**w3.org/1999/02/22-rdf-syntax-**ns#<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>>>>>> PREFIX rdfs: <http://www.w3.org/2000/01/****rdf-schema#<http://www.w3.org/2000/01/**rdf-schema#>
>>>>>> <http://www.w3.org/**2000/01/rdf-schema#<http://www.w3.org/2000/01/rdf-schema#>
>>>>>> PREFIX dc: <http://purl.org/dc/elements/****1.1/<http://purl.org/dc/elements/**1.1/>
>>>>>> <http://purl.org/dc/**elements/1.1/ <http://purl.org/dc/elements/1.1/>
>>>>>> SELECT ?property ?range ?property_description ?subproperty
>>>>>> ?subproperty_description
>>>>>> WHERE {
>>>>>>       ?property a owl:ObjectProperty .
>>>>>>       FILTER (?property != owl:bottomObjectProperty) .
>>>>>>       {
>>>>>>           {
>>>>>>               ?property rdfs:domain ?superclass .
>>>>>>               mo:Company rdfs:subClassOf ?superclass .
>>>>>>           }
>>>>>>           UNION
>>>>>>           {
>>>>>>               ?property rdfs:domain ?dunion .
>>>>>>               ?dunion owl:unionOf ?dlist .
>>>>>>               ?dlist list:member ?superclass .
>>>>>>               mo:Company rdfs:subClassOf ?superclass .
>>>>>>           }
>>>>>>       }
>>>>>>       {
>>>>>>           {
>>>>>>               ?property rdfs:range ?superrange .
>>>>>>               ?range rdfs:subClassOf ?superrange .
>>>>>>               FILTER (!isBlank(?range)) .
>>>>>>           }
>>>>>>           UNION
>>>>>>           {
>>>>>>               ?property rdfs:range ?range .
>>>>>>               FILTER (!isBlank(?range)) .
>>>>>>           }
>>>>>>       } .
>>>>>>       FILTER (?range != owl:Nothing) .
>>>>>>       OPTIONAL { ?somesub rdfs:subClassOf ?range . FILTER(?somesub !=
>>>>>> owl:Nothing && ?somesub != ?range)}
>>>>>>       FILTER (!bound(?somesub)) .
>>>>>>       OPTIONAL {
>>>>>>           ?subproperty rdfs:subPropertyOf ?property .
>>>>>>           FILTER(?subproperty != owl:bottomObjectProperty &&
>>>>>> ?subproperty
>>>>>> != ?property)
>>>>>>           OPTIONAL { ?subproperty dc:description
>>>>>> ?subproperty_description
>>>>>> . }
>>>>>>       }
>>>>>>       OPTIONAL { ?property dc:description ?property_description . }
>>>>>> }
>>>>>>
>>>>>> Il 03/12/2012 07:53, Hasan Hasan ha scritto:
>>>>>>
>>>>>>   Hi Giuseppe
>>>>>>> can you please provide an example of the query that you use and that I
>>>>>>> can
>>>>>>> reproduce easily?
>>>>>>> I will try to take some time this week to have a look.
>>>>>>>
>>>>>>> Kind regards
>>>>>>> Hasan
>>>>>>>
>>>>>>> On Fri, Nov 30, 2012 at 5:36 PM, Giuseppe Miscione <
>>>>>>> g.miscione@**innovationenginee**ring.eu<http://innovationengineering.eu>
>>>>>>> <g....@innovationengineering.eu>
>>>>>>> wrote:
>>>>>>>
>>>>>>>    Hi all,
>>>>>>>
>>>>>>>> I found a bug in the SPARQL query execution chain, specifically in
>>>>>>>> the
>>>>>>>> *org.apache.clerezza.rdf.core.******sparql.query.Query* objects
>>>>>>>> serialization
>>>>>>>> made with the *org.apache.clerezza.rdf.core.**
>>>>>>>> ****sparql.query.impl.****
>>>>>>>> SimpleStringQuerySerializer*
>>>>>>>> methods.
>>>>>>>> The problem comes from the fact that the javacc objects used for
>>>>>>>> mapping
>>>>>>>> triple patterns are not listed in the same order as in the original
>>>>>>>> query
>>>>>>>> string. *SimpleStringQuerySerializer* serializes patterns into the
>>>>>>>> ouput
>>>>>>>> string in the order returned by the javacc parser, and so the output
>>>>>>>> string
>>>>>>>> won't always be equivalent to the source one. Moreover, parsing
>>>>>>>> multiple
>>>>>>>> times the same query string will result in different output strings.
>>>>>>>>
>>>>>>>> This problem is even more annoying when executing (like in my case)
>>>>>>>> queries on graphs enanched with Pellet reasoner, because it has
>>>>>>>> obviuos
>>>>>>>> difficulties in inferencing relations if the order of triple patterns
>>>>>>>> in
>>>>>>>> the query is not the provided one.
>>>>>>>>
>>>>>>>> I solved the problem in my environment by simply saving the original
>>>>>>>> string into the parsed *Query *object and then making
>>>>>>>> *SimpleStringQuerySerializer* returns this string, without any
>>>>>>>> processing.
>>>>>>>>
>>>>>>>> Can anyone take a look at the serializer to find a maybe better
>>>>>>>> solution
>>>>>>>> to avoid this weird behaviour?
>>>>>>>>
>>>>>>>> Regards,
>>>>>>>> Giuseppe Miscione
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>


Re: Bug in SPARQL query serialization

Posted by Reto Bachmann-Gmür <re...@apache.org>.
Hi Giuseppe and Hasan

If the order of the order of patter is relevant then this should model this
as a list. Using LinkeddHashSet in BasicGraphPattern would tie this to a
particular implementation. As far as I know the order of the clauses has no
relevance by the sparql spec (like the order of triples in a graph). But we
could maybe change our implementation so that it no longer supports
querying by queries described as object trees but only as string, the
parsing necessary for the fastlane could be limited to detecting the type
of query (to parse the result in the right way) and the graphs agains which
the query is directed.

Cheers,
Reto


On Sat, Dec 8, 2012 at 3:45 PM, Giuseppe Miscione <
g.miscione@innovationengineering.eu> wrote:

> Hi Hasan,
> I had a look at the code changes that you've made.
> I saw that you introduced in the parser produced objects methods that now
> works with Lists and you've deprecated the methods working with Sets. Now,
> I have a personal cosideration: wouldn't it be easier to restore the old
> code and use LinkedHashSets instead of HashSets, without changing so much
> the class interfaces with the introduction of deprecated methods?
>
> Il 08/12/2012 14:27, Hasan Hasan ha scritto:
>
>  Hi Giuseppe
>>
>> I have resolved the issue
>> CLEREZZA-725<https://issues.**apache.org/jira/browse/**CLEREZZA-725<https://issues.apache.org/jira/browse/CLEREZZA-725>>
>> which
>> reflects the problem you raised.
>>
>> Kind regards
>> Hasan
>>
>> On Tue, Dec 4, 2012 at 11:34 PM, Hasan Hasan <ha...@trialox.org> wrote:
>>
>>  Thanks Giuseppe
>>> *
>>> *
>>> I'll try the test as soon as I have time during this week.
>>>
>>> Cheers
>>> Hasan
>>>
>>>
>>> On Mon, Dec 3, 2012 at 3:13 PM, Giuseppe Miscione <
>>> g.miscione@**innovationengineering.eu<g....@innovationengineering.eu>>
>>> wrote:
>>>
>>>  Hi Hasan,
>>>> I prepared a JUnit test method that clarifies the problem:
>>>>
>>>> @Test
>>>> public void testParseMultipleTimes() throws Exception {
>>>>      String queryString =
>>>>          "PREFIX mo: <http://www.tech-it-easy-**
>>>> project.eu/ontologies/market_****ontology.owl#<http://project.eu/ontologies/market_**ontology.owl#>
>>>> <http://www.**tech-it-easy-project.eu/**ontologies/market_ontology.**
>>>> owl#<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>
>>>> >>\n"
>>>> +
>>>>          "PREFIX list: <http://jena.hpl.hp.com/ARQ/****list#<http://jena.hpl.hp.com/ARQ/**list#>
>>>> <http://jena.hpl.hp.com/**ARQ/list# <http://jena.hpl.hp.com/ARQ/list#>
>>>> >>\n"
>>>> +
>>>>          "PREFIX owl: <http://www.w3.org/2002/07/****owl#<http://www.w3.org/2002/07/**owl#>
>>>> <http://www.w3.org/2002/**07/owl# <http://www.w3.org/2002/07/owl#>>>\n"
>>>> +
>>>>          "PREFIX rdf: <http://www.w3.org/1999/02/22-****rdf-syntax-ns#<http://www.w3.org/1999/02/22-**rdf-syntax-ns#>
>>>> <http://www.**w3.org/1999/02/22-rdf-syntax-**ns#<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>>>> >>\n"
>>>> +
>>>>          "PREFIX rdfs: <http://www.w3.org/2000/01/****rdf-schema#<http://www.w3.org/2000/01/**rdf-schema#>
>>>> <http://www.w3.org/**2000/01/rdf-schema#<http://www.w3.org/2000/01/rdf-schema#>
>>>> >>\n"
>>>> +
>>>>          "PREFIX dc: <http://purl.org/dc/elements/****1.1/<http://purl.org/dc/elements/**1.1/>
>>>> <http://purl.org/dc/**elements/1.1/ <http://purl.org/dc/elements/1.1/>
>>>> >>\n"
>>>> +
>>>>          "SELECT ?property ?range ?property_description ?subproperty
>>>> ?subproperty_description\n" +
>>>>          "WHERE {\n" +
>>>>          "    ?property a owl:ObjectProperty .\n" +
>>>>          "    FILTER (?property != owl:bottomObjectProperty) .\n" +
>>>>          "    {\n" +
>>>>          "        {\n" +
>>>>          "            ?property rdfs:domain ?superclass .\n" +
>>>>          "            mo:Company rdfs:subClassOf ?superclass .\n" +
>>>>          "        }\n" +
>>>>          "        UNION\n" +
>>>>          "        {\n" +
>>>>          "            ?property rdfs:domain ?dunion .\n" +
>>>>          "            ?dunion owl:unionOf ?dlist .\n" +
>>>>          "            ?dlist list:member ?superclass .\n" +
>>>>          "            mo:Company rdfs:subClassOf ?superclass .\n" +
>>>>          "        }\n" +
>>>>          "    }\n" +
>>>>          "    {\n" +
>>>>          "        {\n" +
>>>>          "            ?property rdfs:range ?superrange .\n" +
>>>>          "            ?range rdfs:subClassOf ?superrange .\n" +
>>>>          "            FILTER (!isBlank(?range)) .\n" +
>>>>          "        }\n" +
>>>>          "        UNION\n" +
>>>>          "        {\n" +
>>>>          "            ?property rdfs:range ?range .\n" +
>>>>          "            FILTER (!isBlank(?range)) .\n" +
>>>>          "        }\n" +
>>>>          "    } .\n" +
>>>>          "    FILTER (?range != owl:Nothing) .\n" +
>>>>          "    OPTIONAL { ?somesub rdfs:subClassOf ?range .
>>>> FILTER(?somesub
>>>> != owl:Nothing && ?somesub != ?range)}\n" +
>>>>          "    FILTER (!bound(?somesub)) .\n" +
>>>>          "    OPTIONAL {\n" +
>>>>          "        ?subproperty rdfs:subPropertyOf ?property .\n" +
>>>>          "        FILTER(?subproperty != owl:bottomObjectProperty &&
>>>> ?subproperty != ?property)\n" +
>>>>          "        OPTIONAL { ?subproperty dc:description
>>>> ?subproperty_description . }\n" +
>>>>          "    }\n" +
>>>>          "    OPTIONAL { ?property dc:description ?property_description
>>>> .
>>>> }\n" +
>>>>          "} ";
>>>>
>>>>      Query query1 = QueryParser.getInstance().****parse(queryString);
>>>>      System.out.println(query1.****toString());
>>>>
>>>>      System.out.println("----------****-------------");
>>>>
>>>>      Thread.sleep(5000l);
>>>>
>>>>      Query query2 = QueryParser.getInstance().****parse(queryString);
>>>>      System.out.println(query2.****toString());
>>>>
>>>>      Assert.assertEquals(query1.****toString(), query2.toString());
>>>> }
>>>>
>>>> By separating the two parse() calls with a 5 seconds sleep, you'll see
>>>> that the two parsed objects will produce different strings. Without the
>>>> Thread.sleep() call the test method doesn't fail, so I think there's
>>>> something time-related in the javacc parser that will mix up the parsed
>>>> statements.
>>>>
>>>> Regards,
>>>> Giuseppe
>>>>
>>>> Il 03/12/2012 10:25, Giuseppe Miscione ha scritto:
>>>>
>>>>   Hi Hasan,
>>>>
>>>>> this is the query on which I was working:
>>>>>
>>>>> PREFIX mo: <http://www.tech-it-easy-**pro**
>>>>> ject.eu/ontologies/market_** <http://project.eu/ontologies/market_**>
>>>>> ontology.owl#<http://www.tech-**it-easy-project.eu/ontologies/**
>>>>> market_ontology.owl#<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>
>>>>> >
>>>>> PREFIX list: <http://jena.hpl.hp.com/ARQ/****list#<http://jena.hpl.hp.com/ARQ/**list#>
>>>>> <http://jena.hpl.hp.com/**ARQ/list# <http://jena.hpl.hp.com/ARQ/list#>
>>>>> >
>>>>> PREFIX owl: <http://www.w3.org/2002/07/****owl#<http://www.w3.org/2002/07/**owl#>
>>>>> <http://www.w3.org/2002/**07/owl# <http://www.w3.org/2002/07/owl#>>
>>>>> PREFIX rdf: <http://www.w3.org/1999/02/22-****rdf-syntax-ns#<http://www.w3.org/1999/02/22-**rdf-syntax-ns#>
>>>>> <http://www.**w3.org/1999/02/22-rdf-syntax-**ns#<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>>>>> >
>>>>> PREFIX rdfs: <http://www.w3.org/2000/01/****rdf-schema#<http://www.w3.org/2000/01/**rdf-schema#>
>>>>> <http://www.w3.org/**2000/01/rdf-schema#<http://www.w3.org/2000/01/rdf-schema#>
>>>>> >
>>>>> PREFIX dc: <http://purl.org/dc/elements/****1.1/<http://purl.org/dc/elements/**1.1/>
>>>>> <http://purl.org/dc/**elements/1.1/ <http://purl.org/dc/elements/1.1/>
>>>>> >
>>>>> SELECT ?property ?range ?property_description ?subproperty
>>>>> ?subproperty_description
>>>>> WHERE {
>>>>>      ?property a owl:ObjectProperty .
>>>>>      FILTER (?property != owl:bottomObjectProperty) .
>>>>>      {
>>>>>          {
>>>>>              ?property rdfs:domain ?superclass .
>>>>>              mo:Company rdfs:subClassOf ?superclass .
>>>>>          }
>>>>>          UNION
>>>>>          {
>>>>>              ?property rdfs:domain ?dunion .
>>>>>              ?dunion owl:unionOf ?dlist .
>>>>>              ?dlist list:member ?superclass .
>>>>>              mo:Company rdfs:subClassOf ?superclass .
>>>>>          }
>>>>>      }
>>>>>      {
>>>>>          {
>>>>>              ?property rdfs:range ?superrange .
>>>>>              ?range rdfs:subClassOf ?superrange .
>>>>>              FILTER (!isBlank(?range)) .
>>>>>          }
>>>>>          UNION
>>>>>          {
>>>>>              ?property rdfs:range ?range .
>>>>>              FILTER (!isBlank(?range)) .
>>>>>          }
>>>>>      } .
>>>>>      FILTER (?range != owl:Nothing) .
>>>>>      OPTIONAL { ?somesub rdfs:subClassOf ?range . FILTER(?somesub !=
>>>>> owl:Nothing && ?somesub != ?range)}
>>>>>      FILTER (!bound(?somesub)) .
>>>>>      OPTIONAL {
>>>>>          ?subproperty rdfs:subPropertyOf ?property .
>>>>>          FILTER(?subproperty != owl:bottomObjectProperty &&
>>>>> ?subproperty
>>>>> != ?property)
>>>>>          OPTIONAL { ?subproperty dc:description
>>>>> ?subproperty_description
>>>>> . }
>>>>>      }
>>>>>      OPTIONAL { ?property dc:description ?property_description . }
>>>>> }
>>>>>
>>>>> Il 03/12/2012 07:53, Hasan Hasan ha scritto:
>>>>>
>>>>>  Hi Giuseppe
>>>>>>
>>>>>> can you please provide an example of the query that you use and that I
>>>>>> can
>>>>>> reproduce easily?
>>>>>> I will try to take some time this week to have a look.
>>>>>>
>>>>>> Kind regards
>>>>>> Hasan
>>>>>>
>>>>>> On Fri, Nov 30, 2012 at 5:36 PM, Giuseppe Miscione <
>>>>>> g.miscione@**innovationenginee**ring.eu<http://innovationengineering.eu>
>>>>>> <g....@innovationengineering.eu>
>>>>>> >>
>>>>>> wrote:
>>>>>>
>>>>>>   Hi all,
>>>>>>
>>>>>>> I found a bug in the SPARQL query execution chain, specifically in
>>>>>>> the
>>>>>>> *org.apache.clerezza.rdf.core.******sparql.query.Query* objects
>>>>>>> serialization
>>>>>>> made with the *org.apache.clerezza.rdf.core.**
>>>>>>> ****sparql.query.impl.****
>>>>>>> SimpleStringQuerySerializer*
>>>>>>> methods.
>>>>>>> The problem comes from the fact that the javacc objects used for
>>>>>>> mapping
>>>>>>> triple patterns are not listed in the same order as in the original
>>>>>>> query
>>>>>>> string. *SimpleStringQuerySerializer* serializes patterns into the
>>>>>>> ouput
>>>>>>> string in the order returned by the javacc parser, and so the output
>>>>>>> string
>>>>>>> won't always be equivalent to the source one. Moreover, parsing
>>>>>>> multiple
>>>>>>> times the same query string will result in different output strings.
>>>>>>>
>>>>>>> This problem is even more annoying when executing (like in my case)
>>>>>>> queries on graphs enanched with Pellet reasoner, because it has
>>>>>>> obviuos
>>>>>>> difficulties in inferencing relations if the order of triple patterns
>>>>>>> in
>>>>>>> the query is not the provided one.
>>>>>>>
>>>>>>> I solved the problem in my environment by simply saving the original
>>>>>>> string into the parsed *Query *object and then making
>>>>>>> *SimpleStringQuerySerializer* returns this string, without any
>>>>>>> processing.
>>>>>>>
>>>>>>> Can anyone take a look at the serializer to find a maybe better
>>>>>>> solution
>>>>>>> to avoid this weird behaviour?
>>>>>>>
>>>>>>> Regards,
>>>>>>> Giuseppe Miscione
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>

Re: Bug in SPARQL query serialization

Posted by Giuseppe Miscione <g....@innovationengineering.eu>.
Hi Hasan,
I had a look at the code changes that you've made.
I saw that you introduced in the parser produced objects methods that 
now works with Lists and you've deprecated the methods working with 
Sets. Now, I have a personal cosideration: wouldn't it be easier to 
restore the old code and use LinkedHashSets instead of HashSets, without 
changing so much the class interfaces with the introduction of 
deprecated methods?

Il 08/12/2012 14:27, Hasan Hasan ha scritto:
> Hi Giuseppe
>
> I have resolved the issue
> CLEREZZA-725<https://issues.apache.org/jira/browse/CLEREZZA-725> which
> reflects the problem you raised.
>
> Kind regards
> Hasan
>
> On Tue, Dec 4, 2012 at 11:34 PM, Hasan Hasan <ha...@trialox.org> wrote:
>
>> Thanks Giuseppe
>> *
>> *
>> I'll try the test as soon as I have time during this week.
>>
>> Cheers
>> Hasan
>>
>>
>> On Mon, Dec 3, 2012 at 3:13 PM, Giuseppe Miscione <
>> g.miscione@innovationengineering.eu> wrote:
>>
>>> Hi Hasan,
>>> I prepared a JUnit test method that clarifies the problem:
>>>
>>> @Test
>>> public void testParseMultipleTimes() throws Exception {
>>>      String queryString =
>>>          "PREFIX mo: <http://www.tech-it-easy-**
>>> project.eu/ontologies/market_**ontology.owl#<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>>\n"
>>> +
>>>          "PREFIX list: <http://jena.hpl.hp.com/ARQ/**list#<http://jena.hpl.hp.com/ARQ/list#>>\n"
>>> +
>>>          "PREFIX owl: <http://www.w3.org/2002/07/**owl#<http://www.w3.org/2002/07/owl#>>\n"
>>> +
>>>          "PREFIX rdf: <http://www.w3.org/1999/02/22-**rdf-syntax-ns#<http://www.w3.org/1999/02/22-rdf-syntax-ns#>>\n"
>>> +
>>>          "PREFIX rdfs: <http://www.w3.org/2000/01/**rdf-schema#<http://www.w3.org/2000/01/rdf-schema#>>\n"
>>> +
>>>          "PREFIX dc: <http://purl.org/dc/elements/**1.1/<http://purl.org/dc/elements/1.1/>>\n"
>>> +
>>>          "SELECT ?property ?range ?property_description ?subproperty
>>> ?subproperty_description\n" +
>>>          "WHERE {\n" +
>>>          "    ?property a owl:ObjectProperty .\n" +
>>>          "    FILTER (?property != owl:bottomObjectProperty) .\n" +
>>>          "    {\n" +
>>>          "        {\n" +
>>>          "            ?property rdfs:domain ?superclass .\n" +
>>>          "            mo:Company rdfs:subClassOf ?superclass .\n" +
>>>          "        }\n" +
>>>          "        UNION\n" +
>>>          "        {\n" +
>>>          "            ?property rdfs:domain ?dunion .\n" +
>>>          "            ?dunion owl:unionOf ?dlist .\n" +
>>>          "            ?dlist list:member ?superclass .\n" +
>>>          "            mo:Company rdfs:subClassOf ?superclass .\n" +
>>>          "        }\n" +
>>>          "    }\n" +
>>>          "    {\n" +
>>>          "        {\n" +
>>>          "            ?property rdfs:range ?superrange .\n" +
>>>          "            ?range rdfs:subClassOf ?superrange .\n" +
>>>          "            FILTER (!isBlank(?range)) .\n" +
>>>          "        }\n" +
>>>          "        UNION\n" +
>>>          "        {\n" +
>>>          "            ?property rdfs:range ?range .\n" +
>>>          "            FILTER (!isBlank(?range)) .\n" +
>>>          "        }\n" +
>>>          "    } .\n" +
>>>          "    FILTER (?range != owl:Nothing) .\n" +
>>>          "    OPTIONAL { ?somesub rdfs:subClassOf ?range . FILTER(?somesub
>>> != owl:Nothing && ?somesub != ?range)}\n" +
>>>          "    FILTER (!bound(?somesub)) .\n" +
>>>          "    OPTIONAL {\n" +
>>>          "        ?subproperty rdfs:subPropertyOf ?property .\n" +
>>>          "        FILTER(?subproperty != owl:bottomObjectProperty &&
>>> ?subproperty != ?property)\n" +
>>>          "        OPTIONAL { ?subproperty dc:description
>>> ?subproperty_description . }\n" +
>>>          "    }\n" +
>>>          "    OPTIONAL { ?property dc:description ?property_description .
>>> }\n" +
>>>          "} ";
>>>
>>>      Query query1 = QueryParser.getInstance().**parse(queryString);
>>>      System.out.println(query1.**toString());
>>>
>>>      System.out.println("----------**-------------");
>>>
>>>      Thread.sleep(5000l);
>>>
>>>      Query query2 = QueryParser.getInstance().**parse(queryString);
>>>      System.out.println(query2.**toString());
>>>
>>>      Assert.assertEquals(query1.**toString(), query2.toString());
>>> }
>>>
>>> By separating the two parse() calls with a 5 seconds sleep, you'll see
>>> that the two parsed objects will produce different strings. Without the
>>> Thread.sleep() call the test method doesn't fail, so I think there's
>>> something time-related in the javacc parser that will mix up the parsed
>>> statements.
>>>
>>> Regards,
>>> Giuseppe
>>>
>>> Il 03/12/2012 10:25, Giuseppe Miscione ha scritto:
>>>
>>>   Hi Hasan,
>>>> this is the query on which I was working:
>>>>
>>>> PREFIX mo: <http://www.tech-it-easy-**project.eu/ontologies/market_**
>>>> ontology.owl#<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>
>>>> PREFIX list: <http://jena.hpl.hp.com/ARQ/**list#<http://jena.hpl.hp.com/ARQ/list#>
>>>> PREFIX owl: <http://www.w3.org/2002/07/**owl#<http://www.w3.org/2002/07/owl#>
>>>> PREFIX rdf: <http://www.w3.org/1999/02/22-**rdf-syntax-ns#<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>>>> PREFIX rdfs: <http://www.w3.org/2000/01/**rdf-schema#<http://www.w3.org/2000/01/rdf-schema#>
>>>> PREFIX dc: <http://purl.org/dc/elements/**1.1/<http://purl.org/dc/elements/1.1/>
>>>> SELECT ?property ?range ?property_description ?subproperty
>>>> ?subproperty_description
>>>> WHERE {
>>>>      ?property a owl:ObjectProperty .
>>>>      FILTER (?property != owl:bottomObjectProperty) .
>>>>      {
>>>>          {
>>>>              ?property rdfs:domain ?superclass .
>>>>              mo:Company rdfs:subClassOf ?superclass .
>>>>          }
>>>>          UNION
>>>>          {
>>>>              ?property rdfs:domain ?dunion .
>>>>              ?dunion owl:unionOf ?dlist .
>>>>              ?dlist list:member ?superclass .
>>>>              mo:Company rdfs:subClassOf ?superclass .
>>>>          }
>>>>      }
>>>>      {
>>>>          {
>>>>              ?property rdfs:range ?superrange .
>>>>              ?range rdfs:subClassOf ?superrange .
>>>>              FILTER (!isBlank(?range)) .
>>>>          }
>>>>          UNION
>>>>          {
>>>>              ?property rdfs:range ?range .
>>>>              FILTER (!isBlank(?range)) .
>>>>          }
>>>>      } .
>>>>      FILTER (?range != owl:Nothing) .
>>>>      OPTIONAL { ?somesub rdfs:subClassOf ?range . FILTER(?somesub !=
>>>> owl:Nothing && ?somesub != ?range)}
>>>>      FILTER (!bound(?somesub)) .
>>>>      OPTIONAL {
>>>>          ?subproperty rdfs:subPropertyOf ?property .
>>>>          FILTER(?subproperty != owl:bottomObjectProperty && ?subproperty
>>>> != ?property)
>>>>          OPTIONAL { ?subproperty dc:description ?subproperty_description
>>>> . }
>>>>      }
>>>>      OPTIONAL { ?property dc:description ?property_description . }
>>>> }
>>>>
>>>> Il 03/12/2012 07:53, Hasan Hasan ha scritto:
>>>>
>>>>> Hi Giuseppe
>>>>>
>>>>> can you please provide an example of the query that you use and that I
>>>>> can
>>>>> reproduce easily?
>>>>> I will try to take some time this week to have a look.
>>>>>
>>>>> Kind regards
>>>>> Hasan
>>>>>
>>>>> On Fri, Nov 30, 2012 at 5:36 PM, Giuseppe Miscione <
>>>>> g.miscione@**innovationengineering.eu<g....@innovationengineering.eu>>
>>>>> wrote:
>>>>>
>>>>>   Hi all,
>>>>>> I found a bug in the SPARQL query execution chain, specifically in the
>>>>>> *org.apache.clerezza.rdf.core.****sparql.query.Query* objects
>>>>>> serialization
>>>>>> made with the *org.apache.clerezza.rdf.core.****sparql.query.impl.****
>>>>>> SimpleStringQuerySerializer*
>>>>>> methods.
>>>>>> The problem comes from the fact that the javacc objects used for
>>>>>> mapping
>>>>>> triple patterns are not listed in the same order as in the original
>>>>>> query
>>>>>> string. *SimpleStringQuerySerializer* serializes patterns into the
>>>>>> ouput
>>>>>> string in the order returned by the javacc parser, and so the output
>>>>>> string
>>>>>> won't always be equivalent to the source one. Moreover, parsing
>>>>>> multiple
>>>>>> times the same query string will result in different output strings.
>>>>>>
>>>>>> This problem is even more annoying when executing (like in my case)
>>>>>> queries on graphs enanched with Pellet reasoner, because it has obviuos
>>>>>> difficulties in inferencing relations if the order of triple patterns
>>>>>> in
>>>>>> the query is not the provided one.
>>>>>>
>>>>>> I solved the problem in my environment by simply saving the original
>>>>>> string into the parsed *Query *object and then making
>>>>>> *SimpleStringQuerySerializer* returns this string, without any
>>>>>> processing.
>>>>>>
>>>>>> Can anyone take a look at the serializer to find a maybe better
>>>>>> solution
>>>>>> to avoid this weird behaviour?
>>>>>>
>>>>>> Regards,
>>>>>> Giuseppe Miscione
>>>>>>
>>>>>>
>>>>>>


Re: Bug in SPARQL query serialization

Posted by Giuseppe Miscione <g....@innovationengineering.eu>.
Hi Hasan,
thank you!

Regards,
Giuseppe

Il 08/12/2012 14:27, Hasan Hasan ha scritto:
> Hi Giuseppe
>
> I have resolved the issue
> CLEREZZA-725<https://issues.apache.org/jira/browse/CLEREZZA-725> which
> reflects the problem you raised.
>
> Kind regards
> Hasan
>
> On Tue, Dec 4, 2012 at 11:34 PM, Hasan Hasan <ha...@trialox.org> wrote:
>
>> Thanks Giuseppe
>> *
>> *
>> I'll try the test as soon as I have time during this week.
>>
>> Cheers
>> Hasan
>>
>>
>> On Mon, Dec 3, 2012 at 3:13 PM, Giuseppe Miscione <
>> g.miscione@innovationengineering.eu> wrote:
>>
>>> Hi Hasan,
>>> I prepared a JUnit test method that clarifies the problem:
>>>
>>> @Test
>>> public void testParseMultipleTimes() throws Exception {
>>>      String queryString =
>>>          "PREFIX mo: <http://www.tech-it-easy-**
>>> project.eu/ontologies/market_**ontology.owl#<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>>\n"
>>> +
>>>          "PREFIX list: <http://jena.hpl.hp.com/ARQ/**list#<http://jena.hpl.hp.com/ARQ/list#>>\n"
>>> +
>>>          "PREFIX owl: <http://www.w3.org/2002/07/**owl#<http://www.w3.org/2002/07/owl#>>\n"
>>> +
>>>          "PREFIX rdf: <http://www.w3.org/1999/02/22-**rdf-syntax-ns#<http://www.w3.org/1999/02/22-rdf-syntax-ns#>>\n"
>>> +
>>>          "PREFIX rdfs: <http://www.w3.org/2000/01/**rdf-schema#<http://www.w3.org/2000/01/rdf-schema#>>\n"
>>> +
>>>          "PREFIX dc: <http://purl.org/dc/elements/**1.1/<http://purl.org/dc/elements/1.1/>>\n"
>>> +
>>>          "SELECT ?property ?range ?property_description ?subproperty
>>> ?subproperty_description\n" +
>>>          "WHERE {\n" +
>>>          "    ?property a owl:ObjectProperty .\n" +
>>>          "    FILTER (?property != owl:bottomObjectProperty) .\n" +
>>>          "    {\n" +
>>>          "        {\n" +
>>>          "            ?property rdfs:domain ?superclass .\n" +
>>>          "            mo:Company rdfs:subClassOf ?superclass .\n" +
>>>          "        }\n" +
>>>          "        UNION\n" +
>>>          "        {\n" +
>>>          "            ?property rdfs:domain ?dunion .\n" +
>>>          "            ?dunion owl:unionOf ?dlist .\n" +
>>>          "            ?dlist list:member ?superclass .\n" +
>>>          "            mo:Company rdfs:subClassOf ?superclass .\n" +
>>>          "        }\n" +
>>>          "    }\n" +
>>>          "    {\n" +
>>>          "        {\n" +
>>>          "            ?property rdfs:range ?superrange .\n" +
>>>          "            ?range rdfs:subClassOf ?superrange .\n" +
>>>          "            FILTER (!isBlank(?range)) .\n" +
>>>          "        }\n" +
>>>          "        UNION\n" +
>>>          "        {\n" +
>>>          "            ?property rdfs:range ?range .\n" +
>>>          "            FILTER (!isBlank(?range)) .\n" +
>>>          "        }\n" +
>>>          "    } .\n" +
>>>          "    FILTER (?range != owl:Nothing) .\n" +
>>>          "    OPTIONAL { ?somesub rdfs:subClassOf ?range . FILTER(?somesub
>>> != owl:Nothing && ?somesub != ?range)}\n" +
>>>          "    FILTER (!bound(?somesub)) .\n" +
>>>          "    OPTIONAL {\n" +
>>>          "        ?subproperty rdfs:subPropertyOf ?property .\n" +
>>>          "        FILTER(?subproperty != owl:bottomObjectProperty &&
>>> ?subproperty != ?property)\n" +
>>>          "        OPTIONAL { ?subproperty dc:description
>>> ?subproperty_description . }\n" +
>>>          "    }\n" +
>>>          "    OPTIONAL { ?property dc:description ?property_description .
>>> }\n" +
>>>          "} ";
>>>
>>>      Query query1 = QueryParser.getInstance().**parse(queryString);
>>>      System.out.println(query1.**toString());
>>>
>>>      System.out.println("----------**-------------");
>>>
>>>      Thread.sleep(5000l);
>>>
>>>      Query query2 = QueryParser.getInstance().**parse(queryString);
>>>      System.out.println(query2.**toString());
>>>
>>>      Assert.assertEquals(query1.**toString(), query2.toString());
>>> }
>>>
>>> By separating the two parse() calls with a 5 seconds sleep, you'll see
>>> that the two parsed objects will produce different strings. Without the
>>> Thread.sleep() call the test method doesn't fail, so I think there's
>>> something time-related in the javacc parser that will mix up the parsed
>>> statements.
>>>
>>> Regards,
>>> Giuseppe
>>>
>>> Il 03/12/2012 10:25, Giuseppe Miscione ha scritto:
>>>
>>>   Hi Hasan,
>>>> this is the query on which I was working:
>>>>
>>>> PREFIX mo: <http://www.tech-it-easy-**project.eu/ontologies/market_**
>>>> ontology.owl#<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>
>>>> PREFIX list: <http://jena.hpl.hp.com/ARQ/**list#<http://jena.hpl.hp.com/ARQ/list#>
>>>> PREFIX owl: <http://www.w3.org/2002/07/**owl#<http://www.w3.org/2002/07/owl#>
>>>> PREFIX rdf: <http://www.w3.org/1999/02/22-**rdf-syntax-ns#<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>>>> PREFIX rdfs: <http://www.w3.org/2000/01/**rdf-schema#<http://www.w3.org/2000/01/rdf-schema#>
>>>> PREFIX dc: <http://purl.org/dc/elements/**1.1/<http://purl.org/dc/elements/1.1/>
>>>> SELECT ?property ?range ?property_description ?subproperty
>>>> ?subproperty_description
>>>> WHERE {
>>>>      ?property a owl:ObjectProperty .
>>>>      FILTER (?property != owl:bottomObjectProperty) .
>>>>      {
>>>>          {
>>>>              ?property rdfs:domain ?superclass .
>>>>              mo:Company rdfs:subClassOf ?superclass .
>>>>          }
>>>>          UNION
>>>>          {
>>>>              ?property rdfs:domain ?dunion .
>>>>              ?dunion owl:unionOf ?dlist .
>>>>              ?dlist list:member ?superclass .
>>>>              mo:Company rdfs:subClassOf ?superclass .
>>>>          }
>>>>      }
>>>>      {
>>>>          {
>>>>              ?property rdfs:range ?superrange .
>>>>              ?range rdfs:subClassOf ?superrange .
>>>>              FILTER (!isBlank(?range)) .
>>>>          }
>>>>          UNION
>>>>          {
>>>>              ?property rdfs:range ?range .
>>>>              FILTER (!isBlank(?range)) .
>>>>          }
>>>>      } .
>>>>      FILTER (?range != owl:Nothing) .
>>>>      OPTIONAL { ?somesub rdfs:subClassOf ?range . FILTER(?somesub !=
>>>> owl:Nothing && ?somesub != ?range)}
>>>>      FILTER (!bound(?somesub)) .
>>>>      OPTIONAL {
>>>>          ?subproperty rdfs:subPropertyOf ?property .
>>>>          FILTER(?subproperty != owl:bottomObjectProperty && ?subproperty
>>>> != ?property)
>>>>          OPTIONAL { ?subproperty dc:description ?subproperty_description
>>>> . }
>>>>      }
>>>>      OPTIONAL { ?property dc:description ?property_description . }
>>>> }
>>>>
>>>> Il 03/12/2012 07:53, Hasan Hasan ha scritto:
>>>>
>>>>> Hi Giuseppe
>>>>>
>>>>> can you please provide an example of the query that you use and that I
>>>>> can
>>>>> reproduce easily?
>>>>> I will try to take some time this week to have a look.
>>>>>
>>>>> Kind regards
>>>>> Hasan
>>>>>
>>>>> On Fri, Nov 30, 2012 at 5:36 PM, Giuseppe Miscione <
>>>>> g.miscione@**innovationengineering.eu<g....@innovationengineering.eu>>
>>>>> wrote:
>>>>>
>>>>>   Hi all,
>>>>>> I found a bug in the SPARQL query execution chain, specifically in the
>>>>>> *org.apache.clerezza.rdf.core.****sparql.query.Query* objects
>>>>>> serialization
>>>>>> made with the *org.apache.clerezza.rdf.core.****sparql.query.impl.****
>>>>>> SimpleStringQuerySerializer*
>>>>>> methods.
>>>>>> The problem comes from the fact that the javacc objects used for
>>>>>> mapping
>>>>>> triple patterns are not listed in the same order as in the original
>>>>>> query
>>>>>> string. *SimpleStringQuerySerializer* serializes patterns into the
>>>>>> ouput
>>>>>> string in the order returned by the javacc parser, and so the output
>>>>>> string
>>>>>> won't always be equivalent to the source one. Moreover, parsing
>>>>>> multiple
>>>>>> times the same query string will result in different output strings.
>>>>>>
>>>>>> This problem is even more annoying when executing (like in my case)
>>>>>> queries on graphs enanched with Pellet reasoner, because it has obviuos
>>>>>> difficulties in inferencing relations if the order of triple patterns
>>>>>> in
>>>>>> the query is not the provided one.
>>>>>>
>>>>>> I solved the problem in my environment by simply saving the original
>>>>>> string into the parsed *Query *object and then making
>>>>>> *SimpleStringQuerySerializer* returns this string, without any
>>>>>> processing.
>>>>>>
>>>>>> Can anyone take a look at the serializer to find a maybe better
>>>>>> solution
>>>>>> to avoid this weird behaviour?
>>>>>>
>>>>>> Regards,
>>>>>> Giuseppe Miscione
>>>>>>
>>>>>>
>>>>>>


Re: Bug in SPARQL query serialization

Posted by Hasan Hasan <ha...@trialox.org>.
Hi Giuseppe

I have resolved the issue
CLEREZZA-725<https://issues.apache.org/jira/browse/CLEREZZA-725> which
reflects the problem you raised.

Kind regards
Hasan

On Tue, Dec 4, 2012 at 11:34 PM, Hasan Hasan <ha...@trialox.org> wrote:

> Thanks Giuseppe
> *
> *
> I'll try the test as soon as I have time during this week.
>
> Cheers
> Hasan
>
>
> On Mon, Dec 3, 2012 at 3:13 PM, Giuseppe Miscione <
> g.miscione@innovationengineering.eu> wrote:
>
>> Hi Hasan,
>> I prepared a JUnit test method that clarifies the problem:
>>
>> @Test
>> public void testParseMultipleTimes() throws Exception {
>>     String queryString =
>>         "PREFIX mo: <http://www.tech-it-easy-**
>> project.eu/ontologies/market_**ontology.owl#<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>>\n"
>> +
>>         "PREFIX list: <http://jena.hpl.hp.com/ARQ/**list#<http://jena.hpl.hp.com/ARQ/list#>>\n"
>> +
>>         "PREFIX owl: <http://www.w3.org/2002/07/**owl#<http://www.w3.org/2002/07/owl#>>\n"
>> +
>>         "PREFIX rdf: <http://www.w3.org/1999/02/22-**rdf-syntax-ns#<http://www.w3.org/1999/02/22-rdf-syntax-ns#>>\n"
>> +
>>         "PREFIX rdfs: <http://www.w3.org/2000/01/**rdf-schema#<http://www.w3.org/2000/01/rdf-schema#>>\n"
>> +
>>         "PREFIX dc: <http://purl.org/dc/elements/**1.1/<http://purl.org/dc/elements/1.1/>>\n"
>> +
>>         "SELECT ?property ?range ?property_description ?subproperty
>> ?subproperty_description\n" +
>>         "WHERE {\n" +
>>         "    ?property a owl:ObjectProperty .\n" +
>>         "    FILTER (?property != owl:bottomObjectProperty) .\n" +
>>         "    {\n" +
>>         "        {\n" +
>>         "            ?property rdfs:domain ?superclass .\n" +
>>         "            mo:Company rdfs:subClassOf ?superclass .\n" +
>>         "        }\n" +
>>         "        UNION\n" +
>>         "        {\n" +
>>         "            ?property rdfs:domain ?dunion .\n" +
>>         "            ?dunion owl:unionOf ?dlist .\n" +
>>         "            ?dlist list:member ?superclass .\n" +
>>         "            mo:Company rdfs:subClassOf ?superclass .\n" +
>>         "        }\n" +
>>         "    }\n" +
>>         "    {\n" +
>>         "        {\n" +
>>         "            ?property rdfs:range ?superrange .\n" +
>>         "            ?range rdfs:subClassOf ?superrange .\n" +
>>         "            FILTER (!isBlank(?range)) .\n" +
>>         "        }\n" +
>>         "        UNION\n" +
>>         "        {\n" +
>>         "            ?property rdfs:range ?range .\n" +
>>         "            FILTER (!isBlank(?range)) .\n" +
>>         "        }\n" +
>>         "    } .\n" +
>>         "    FILTER (?range != owl:Nothing) .\n" +
>>         "    OPTIONAL { ?somesub rdfs:subClassOf ?range . FILTER(?somesub
>> != owl:Nothing && ?somesub != ?range)}\n" +
>>         "    FILTER (!bound(?somesub)) .\n" +
>>         "    OPTIONAL {\n" +
>>         "        ?subproperty rdfs:subPropertyOf ?property .\n" +
>>         "        FILTER(?subproperty != owl:bottomObjectProperty &&
>> ?subproperty != ?property)\n" +
>>         "        OPTIONAL { ?subproperty dc:description
>> ?subproperty_description . }\n" +
>>         "    }\n" +
>>         "    OPTIONAL { ?property dc:description ?property_description .
>> }\n" +
>>         "} ";
>>
>>     Query query1 = QueryParser.getInstance().**parse(queryString);
>>     System.out.println(query1.**toString());
>>
>>     System.out.println("----------**-------------");
>>
>>     Thread.sleep(5000l);
>>
>>     Query query2 = QueryParser.getInstance().**parse(queryString);
>>     System.out.println(query2.**toString());
>>
>>     Assert.assertEquals(query1.**toString(), query2.toString());
>> }
>>
>> By separating the two parse() calls with a 5 seconds sleep, you'll see
>> that the two parsed objects will produce different strings. Without the
>> Thread.sleep() call the test method doesn't fail, so I think there's
>> something time-related in the javacc parser that will mix up the parsed
>> statements.
>>
>> Regards,
>> Giuseppe
>>
>> Il 03/12/2012 10:25, Giuseppe Miscione ha scritto:
>>
>>  Hi Hasan,
>>> this is the query on which I was working:
>>>
>>> PREFIX mo: <http://www.tech-it-easy-**project.eu/ontologies/market_**
>>> ontology.owl#<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>
>>> >
>>> PREFIX list: <http://jena.hpl.hp.com/ARQ/**list#<http://jena.hpl.hp.com/ARQ/list#>
>>> >
>>> PREFIX owl: <http://www.w3.org/2002/07/**owl#<http://www.w3.org/2002/07/owl#>
>>> >
>>> PREFIX rdf: <http://www.w3.org/1999/02/22-**rdf-syntax-ns#<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>>> >
>>> PREFIX rdfs: <http://www.w3.org/2000/01/**rdf-schema#<http://www.w3.org/2000/01/rdf-schema#>
>>> >
>>> PREFIX dc: <http://purl.org/dc/elements/**1.1/<http://purl.org/dc/elements/1.1/>
>>> >
>>> SELECT ?property ?range ?property_description ?subproperty
>>> ?subproperty_description
>>> WHERE {
>>>     ?property a owl:ObjectProperty .
>>>     FILTER (?property != owl:bottomObjectProperty) .
>>>     {
>>>         {
>>>             ?property rdfs:domain ?superclass .
>>>             mo:Company rdfs:subClassOf ?superclass .
>>>         }
>>>         UNION
>>>         {
>>>             ?property rdfs:domain ?dunion .
>>>             ?dunion owl:unionOf ?dlist .
>>>             ?dlist list:member ?superclass .
>>>             mo:Company rdfs:subClassOf ?superclass .
>>>         }
>>>     }
>>>     {
>>>         {
>>>             ?property rdfs:range ?superrange .
>>>             ?range rdfs:subClassOf ?superrange .
>>>             FILTER (!isBlank(?range)) .
>>>         }
>>>         UNION
>>>         {
>>>             ?property rdfs:range ?range .
>>>             FILTER (!isBlank(?range)) .
>>>         }
>>>     } .
>>>     FILTER (?range != owl:Nothing) .
>>>     OPTIONAL { ?somesub rdfs:subClassOf ?range . FILTER(?somesub !=
>>> owl:Nothing && ?somesub != ?range)}
>>>     FILTER (!bound(?somesub)) .
>>>     OPTIONAL {
>>>         ?subproperty rdfs:subPropertyOf ?property .
>>>         FILTER(?subproperty != owl:bottomObjectProperty && ?subproperty
>>> != ?property)
>>>         OPTIONAL { ?subproperty dc:description ?subproperty_description
>>> . }
>>>     }
>>>     OPTIONAL { ?property dc:description ?property_description . }
>>> }
>>>
>>> Il 03/12/2012 07:53, Hasan Hasan ha scritto:
>>>
>>>> Hi Giuseppe
>>>>
>>>> can you please provide an example of the query that you use and that I
>>>> can
>>>> reproduce easily?
>>>> I will try to take some time this week to have a look.
>>>>
>>>> Kind regards
>>>> Hasan
>>>>
>>>> On Fri, Nov 30, 2012 at 5:36 PM, Giuseppe Miscione <
>>>> g.miscione@**innovationengineering.eu<g....@innovationengineering.eu>>
>>>> wrote:
>>>>
>>>>  Hi all,
>>>>> I found a bug in the SPARQL query execution chain, specifically in the
>>>>> *org.apache.clerezza.rdf.core.****sparql.query.Query* objects
>>>>> serialization
>>>>> made with the *org.apache.clerezza.rdf.core.****sparql.query.impl.****
>>>>> SimpleStringQuerySerializer*
>>>>> methods.
>>>>> The problem comes from the fact that the javacc objects used for
>>>>> mapping
>>>>> triple patterns are not listed in the same order as in the original
>>>>> query
>>>>> string. *SimpleStringQuerySerializer* serializes patterns into the
>>>>> ouput
>>>>> string in the order returned by the javacc parser, and so the output
>>>>> string
>>>>> won't always be equivalent to the source one. Moreover, parsing
>>>>> multiple
>>>>> times the same query string will result in different output strings.
>>>>>
>>>>> This problem is even more annoying when executing (like in my case)
>>>>> queries on graphs enanched with Pellet reasoner, because it has obviuos
>>>>> difficulties in inferencing relations if the order of triple patterns
>>>>> in
>>>>> the query is not the provided one.
>>>>>
>>>>> I solved the problem in my environment by simply saving the original
>>>>> string into the parsed *Query *object and then making
>>>>> *SimpleStringQuerySerializer* returns this string, without any
>>>>> processing.
>>>>>
>>>>> Can anyone take a look at the serializer to find a maybe better
>>>>> solution
>>>>> to avoid this weird behaviour?
>>>>>
>>>>> Regards,
>>>>> Giuseppe Miscione
>>>>>
>>>>>
>>>>>
>>>
>>
>

Re: Bug in SPARQL query serialization

Posted by Hasan Hasan <ha...@trialox.org>.
Thanks Giuseppe
*
*
I'll try the test as soon as I have time during this week.

Cheers
Hasan


On Mon, Dec 3, 2012 at 3:13 PM, Giuseppe Miscione <
g.miscione@innovationengineering.eu> wrote:

> Hi Hasan,
> I prepared a JUnit test method that clarifies the problem:
>
> @Test
> public void testParseMultipleTimes() throws Exception {
>     String queryString =
>         "PREFIX mo: <http://www.tech-it-easy-**
> project.eu/ontologies/market_**ontology.owl#<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>>\n"
> +
>         "PREFIX list: <http://jena.hpl.hp.com/ARQ/**list#<http://jena.hpl.hp.com/ARQ/list#>>\n"
> +
>         "PREFIX owl: <http://www.w3.org/2002/07/**owl#<http://www.w3.org/2002/07/owl#>>\n"
> +
>         "PREFIX rdf: <http://www.w3.org/1999/02/22-**rdf-syntax-ns#<http://www.w3.org/1999/02/22-rdf-syntax-ns#>>\n"
> +
>         "PREFIX rdfs: <http://www.w3.org/2000/01/**rdf-schema#<http://www.w3.org/2000/01/rdf-schema#>>\n"
> +
>         "PREFIX dc: <http://purl.org/dc/elements/**1.1/<http://purl.org/dc/elements/1.1/>>\n"
> +
>         "SELECT ?property ?range ?property_description ?subproperty
> ?subproperty_description\n" +
>         "WHERE {\n" +
>         "    ?property a owl:ObjectProperty .\n" +
>         "    FILTER (?property != owl:bottomObjectProperty) .\n" +
>         "    {\n" +
>         "        {\n" +
>         "            ?property rdfs:domain ?superclass .\n" +
>         "            mo:Company rdfs:subClassOf ?superclass .\n" +
>         "        }\n" +
>         "        UNION\n" +
>         "        {\n" +
>         "            ?property rdfs:domain ?dunion .\n" +
>         "            ?dunion owl:unionOf ?dlist .\n" +
>         "            ?dlist list:member ?superclass .\n" +
>         "            mo:Company rdfs:subClassOf ?superclass .\n" +
>         "        }\n" +
>         "    }\n" +
>         "    {\n" +
>         "        {\n" +
>         "            ?property rdfs:range ?superrange .\n" +
>         "            ?range rdfs:subClassOf ?superrange .\n" +
>         "            FILTER (!isBlank(?range)) .\n" +
>         "        }\n" +
>         "        UNION\n" +
>         "        {\n" +
>         "            ?property rdfs:range ?range .\n" +
>         "            FILTER (!isBlank(?range)) .\n" +
>         "        }\n" +
>         "    } .\n" +
>         "    FILTER (?range != owl:Nothing) .\n" +
>         "    OPTIONAL { ?somesub rdfs:subClassOf ?range . FILTER(?somesub
> != owl:Nothing && ?somesub != ?range)}\n" +
>         "    FILTER (!bound(?somesub)) .\n" +
>         "    OPTIONAL {\n" +
>         "        ?subproperty rdfs:subPropertyOf ?property .\n" +
>         "        FILTER(?subproperty != owl:bottomObjectProperty &&
> ?subproperty != ?property)\n" +
>         "        OPTIONAL { ?subproperty dc:description
> ?subproperty_description . }\n" +
>         "    }\n" +
>         "    OPTIONAL { ?property dc:description ?property_description .
> }\n" +
>         "} ";
>
>     Query query1 = QueryParser.getInstance().**parse(queryString);
>     System.out.println(query1.**toString());
>
>     System.out.println("----------**-------------");
>
>     Thread.sleep(5000l);
>
>     Query query2 = QueryParser.getInstance().**parse(queryString);
>     System.out.println(query2.**toString());
>
>     Assert.assertEquals(query1.**toString(), query2.toString());
> }
>
> By separating the two parse() calls with a 5 seconds sleep, you'll see
> that the two parsed objects will produce different strings. Without the
> Thread.sleep() call the test method doesn't fail, so I think there's
> something time-related in the javacc parser that will mix up the parsed
> statements.
>
> Regards,
> Giuseppe
>
> Il 03/12/2012 10:25, Giuseppe Miscione ha scritto:
>
>  Hi Hasan,
>> this is the query on which I was working:
>>
>> PREFIX mo: <http://www.tech-it-easy-**project.eu/ontologies/market_**
>> ontology.owl#<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>
>> >
>> PREFIX list: <http://jena.hpl.hp.com/ARQ/**list#<http://jena.hpl.hp.com/ARQ/list#>
>> >
>> PREFIX owl: <http://www.w3.org/2002/07/**owl#<http://www.w3.org/2002/07/owl#>
>> >
>> PREFIX rdf: <http://www.w3.org/1999/02/22-**rdf-syntax-ns#<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>> >
>> PREFIX rdfs: <http://www.w3.org/2000/01/**rdf-schema#<http://www.w3.org/2000/01/rdf-schema#>
>> >
>> PREFIX dc: <http://purl.org/dc/elements/**1.1/<http://purl.org/dc/elements/1.1/>
>> >
>> SELECT ?property ?range ?property_description ?subproperty
>> ?subproperty_description
>> WHERE {
>>     ?property a owl:ObjectProperty .
>>     FILTER (?property != owl:bottomObjectProperty) .
>>     {
>>         {
>>             ?property rdfs:domain ?superclass .
>>             mo:Company rdfs:subClassOf ?superclass .
>>         }
>>         UNION
>>         {
>>             ?property rdfs:domain ?dunion .
>>             ?dunion owl:unionOf ?dlist .
>>             ?dlist list:member ?superclass .
>>             mo:Company rdfs:subClassOf ?superclass .
>>         }
>>     }
>>     {
>>         {
>>             ?property rdfs:range ?superrange .
>>             ?range rdfs:subClassOf ?superrange .
>>             FILTER (!isBlank(?range)) .
>>         }
>>         UNION
>>         {
>>             ?property rdfs:range ?range .
>>             FILTER (!isBlank(?range)) .
>>         }
>>     } .
>>     FILTER (?range != owl:Nothing) .
>>     OPTIONAL { ?somesub rdfs:subClassOf ?range . FILTER(?somesub !=
>> owl:Nothing && ?somesub != ?range)}
>>     FILTER (!bound(?somesub)) .
>>     OPTIONAL {
>>         ?subproperty rdfs:subPropertyOf ?property .
>>         FILTER(?subproperty != owl:bottomObjectProperty && ?subproperty
>> != ?property)
>>         OPTIONAL { ?subproperty dc:description ?subproperty_description .
>> }
>>     }
>>     OPTIONAL { ?property dc:description ?property_description . }
>> }
>>
>> Il 03/12/2012 07:53, Hasan Hasan ha scritto:
>>
>>> Hi Giuseppe
>>>
>>> can you please provide an example of the query that you use and that I
>>> can
>>> reproduce easily?
>>> I will try to take some time this week to have a look.
>>>
>>> Kind regards
>>> Hasan
>>>
>>> On Fri, Nov 30, 2012 at 5:36 PM, Giuseppe Miscione <
>>> g.miscione@**innovationengineering.eu<g....@innovationengineering.eu>>
>>> wrote:
>>>
>>>  Hi all,
>>>> I found a bug in the SPARQL query execution chain, specifically in the
>>>> *org.apache.clerezza.rdf.core.****sparql.query.Query* objects
>>>> serialization
>>>> made with the *org.apache.clerezza.rdf.core.****sparql.query.impl.****
>>>> SimpleStringQuerySerializer*
>>>> methods.
>>>> The problem comes from the fact that the javacc objects used for mapping
>>>> triple patterns are not listed in the same order as in the original
>>>> query
>>>> string. *SimpleStringQuerySerializer* serializes patterns into the ouput
>>>> string in the order returned by the javacc parser, and so the output
>>>> string
>>>> won't always be equivalent to the source one. Moreover, parsing multiple
>>>> times the same query string will result in different output strings.
>>>>
>>>> This problem is even more annoying when executing (like in my case)
>>>> queries on graphs enanched with Pellet reasoner, because it has obviuos
>>>> difficulties in inferencing relations if the order of triple patterns in
>>>> the query is not the provided one.
>>>>
>>>> I solved the problem in my environment by simply saving the original
>>>> string into the parsed *Query *object and then making
>>>> *SimpleStringQuerySerializer* returns this string, without any
>>>> processing.
>>>>
>>>> Can anyone take a look at the serializer to find a maybe better solution
>>>> to avoid this weird behaviour?
>>>>
>>>> Regards,
>>>> Giuseppe Miscione
>>>>
>>>>
>>>>
>>
>

Re: Bug in SPARQL query serialization

Posted by Giuseppe Miscione <g....@innovationengineering.eu>.
Hi Hasan,
I prepared a JUnit test method that clarifies the problem:

@Test
public void testParseMultipleTimes() throws Exception {
     String queryString =
         "PREFIX mo: 
<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>\n" +
         "PREFIX list: <http://jena.hpl.hp.com/ARQ/list#>\n" +
         "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n" +
         "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n" +
         "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n" +
         "PREFIX dc: <http://purl.org/dc/elements/1.1/>\n" +
         "SELECT ?property ?range ?property_description ?subproperty 
?subproperty_description\n" +
         "WHERE {\n" +
         "    ?property a owl:ObjectProperty .\n" +
         "    FILTER (?property != owl:bottomObjectProperty) .\n" +
         "    {\n" +
         "        {\n" +
         "            ?property rdfs:domain ?superclass .\n" +
         "            mo:Company rdfs:subClassOf ?superclass .\n" +
         "        }\n" +
         "        UNION\n" +
         "        {\n" +
         "            ?property rdfs:domain ?dunion .\n" +
         "            ?dunion owl:unionOf ?dlist .\n" +
         "            ?dlist list:member ?superclass .\n" +
         "            mo:Company rdfs:subClassOf ?superclass .\n" +
         "        }\n" +
         "    }\n" +
         "    {\n" +
         "        {\n" +
         "            ?property rdfs:range ?superrange .\n" +
         "            ?range rdfs:subClassOf ?superrange .\n" +
         "            FILTER (!isBlank(?range)) .\n" +
         "        }\n" +
         "        UNION\n" +
         "        {\n" +
         "            ?property rdfs:range ?range .\n" +
         "            FILTER (!isBlank(?range)) .\n" +
         "        }\n" +
         "    } .\n" +
         "    FILTER (?range != owl:Nothing) .\n" +
         "    OPTIONAL { ?somesub rdfs:subClassOf ?range . 
FILTER(?somesub != owl:Nothing && ?somesub != ?range)}\n" +
         "    FILTER (!bound(?somesub)) .\n" +
         "    OPTIONAL {\n" +
         "        ?subproperty rdfs:subPropertyOf ?property .\n" +
         "        FILTER(?subproperty != owl:bottomObjectProperty && 
?subproperty != ?property)\n" +
         "        OPTIONAL { ?subproperty dc:description 
?subproperty_description . }\n" +
         "    }\n" +
         "    OPTIONAL { ?property dc:description ?property_description 
. }\n" +
         "} ";

     Query query1 = QueryParser.getInstance().parse(queryString);
     System.out.println(query1.toString());

     System.out.println("-----------------------");

     Thread.sleep(5000l);

     Query query2 = QueryParser.getInstance().parse(queryString);
     System.out.println(query2.toString());

     Assert.assertEquals(query1.toString(), query2.toString());
}

By separating the two parse() calls with a 5 seconds sleep, you'll see 
that the two parsed objects will produce different strings. Without the 
Thread.sleep() call the test method doesn't fail, so I think there's 
something time-related in the javacc parser that will mix up the parsed 
statements.

Regards,
Giuseppe

Il 03/12/2012 10:25, Giuseppe Miscione ha scritto:
> Hi Hasan,
> this is the query on which I was working:
>
> PREFIX mo: 
> <http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>
> PREFIX list: <http://jena.hpl.hp.com/ARQ/list#>
> PREFIX owl: <http://www.w3.org/2002/07/owl#>
> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
> PREFIX dc: <http://purl.org/dc/elements/1.1/>
> SELECT ?property ?range ?property_description ?subproperty 
> ?subproperty_description
> WHERE {
>     ?property a owl:ObjectProperty .
>     FILTER (?property != owl:bottomObjectProperty) .
>     {
>         {
>             ?property rdfs:domain ?superclass .
>             mo:Company rdfs:subClassOf ?superclass .
>         }
>         UNION
>         {
>             ?property rdfs:domain ?dunion .
>             ?dunion owl:unionOf ?dlist .
>             ?dlist list:member ?superclass .
>             mo:Company rdfs:subClassOf ?superclass .
>         }
>     }
>     {
>         {
>             ?property rdfs:range ?superrange .
>             ?range rdfs:subClassOf ?superrange .
>             FILTER (!isBlank(?range)) .
>         }
>         UNION
>         {
>             ?property rdfs:range ?range .
>             FILTER (!isBlank(?range)) .
>         }
>     } .
>     FILTER (?range != owl:Nothing) .
>     OPTIONAL { ?somesub rdfs:subClassOf ?range . FILTER(?somesub != 
> owl:Nothing && ?somesub != ?range)}
>     FILTER (!bound(?somesub)) .
>     OPTIONAL {
>         ?subproperty rdfs:subPropertyOf ?property .
>         FILTER(?subproperty != owl:bottomObjectProperty && 
> ?subproperty != ?property)
>         OPTIONAL { ?subproperty dc:description 
> ?subproperty_description . }
>     }
>     OPTIONAL { ?property dc:description ?property_description . }
> }
>
> Il 03/12/2012 07:53, Hasan Hasan ha scritto:
>> Hi Giuseppe
>>
>> can you please provide an example of the query that you use and that 
>> I can
>> reproduce easily?
>> I will try to take some time this week to have a look.
>>
>> Kind regards
>> Hasan
>>
>> On Fri, Nov 30, 2012 at 5:36 PM, Giuseppe Miscione <
>> g.miscione@innovationengineering.eu> wrote:
>>
>>> Hi all,
>>> I found a bug in the SPARQL query execution chain, specifically in the
>>> *org.apache.clerezza.rdf.core.**sparql.query.Query* objects 
>>> serialization
>>> made with the 
>>> *org.apache.clerezza.rdf.core.**sparql.query.impl.**SimpleStringQuerySerializer*
>>> methods.
>>> The problem comes from the fact that the javacc objects used for 
>>> mapping
>>> triple patterns are not listed in the same order as in the original 
>>> query
>>> string. *SimpleStringQuerySerializer* serializes patterns into the 
>>> ouput
>>> string in the order returned by the javacc parser, and so the output 
>>> string
>>> won't always be equivalent to the source one. Moreover, parsing 
>>> multiple
>>> times the same query string will result in different output strings.
>>>
>>> This problem is even more annoying when executing (like in my case)
>>> queries on graphs enanched with Pellet reasoner, because it has obviuos
>>> difficulties in inferencing relations if the order of triple 
>>> patterns in
>>> the query is not the provided one.
>>>
>>> I solved the problem in my environment by simply saving the original
>>> string into the parsed *Query *object and then making
>>> *SimpleStringQuerySerializer* returns this string, without any 
>>> processing.
>>>
>>> Can anyone take a look at the serializer to find a maybe better 
>>> solution
>>> to avoid this weird behaviour?
>>>
>>> Regards,
>>> Giuseppe Miscione
>>>
>>>
>


Re: Bug in SPARQL query serialization

Posted by Giuseppe Miscione <g....@innovationengineering.eu>.
Hi Hasan,
this is the query on which I was working:

PREFIX mo: 
<http://www.tech-it-easy-project.eu/ontologies/market_ontology.owl#>
PREFIX list: <http://jena.hpl.hp.com/ARQ/list#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?property ?range ?property_description ?subproperty 
?subproperty_description
WHERE {
     ?property a owl:ObjectProperty .
     FILTER (?property != owl:bottomObjectProperty) .
     {
         {
             ?property rdfs:domain ?superclass .
             mo:Company rdfs:subClassOf ?superclass .
         }
         UNION
         {
             ?property rdfs:domain ?dunion .
             ?dunion owl:unionOf ?dlist .
             ?dlist list:member ?superclass .
             mo:Company rdfs:subClassOf ?superclass .
         }
     }
     {
         {
             ?property rdfs:range ?superrange .
             ?range rdfs:subClassOf ?superrange .
             FILTER (!isBlank(?range)) .
         }
         UNION
         {
             ?property rdfs:range ?range .
             FILTER (!isBlank(?range)) .
         }
     } .
     FILTER (?range != owl:Nothing) .
     OPTIONAL { ?somesub rdfs:subClassOf ?range . FILTER(?somesub != 
owl:Nothing && ?somesub != ?range)}
     FILTER (!bound(?somesub)) .
     OPTIONAL {
         ?subproperty rdfs:subPropertyOf ?property .
         FILTER(?subproperty != owl:bottomObjectProperty && ?subproperty 
!= ?property)
         OPTIONAL { ?subproperty dc:description ?subproperty_description . }
     }
     OPTIONAL { ?property dc:description ?property_description . }
}

Il 03/12/2012 07:53, Hasan Hasan ha scritto:
> Hi Giuseppe
>
> can you please provide an example of the query that you use and that I can
> reproduce easily?
> I will try to take some time this week to have a look.
>
> Kind regards
> Hasan
>
> On Fri, Nov 30, 2012 at 5:36 PM, Giuseppe Miscione <
> g.miscione@innovationengineering.eu> wrote:
>
>> Hi all,
>> I found a bug in the SPARQL query execution chain, specifically in the
>> *org.apache.clerezza.rdf.core.**sparql.query.Query* objects serialization
>> made with the *org.apache.clerezza.rdf.core.**sparql.query.impl.**SimpleStringQuerySerializer*
>> methods.
>> The problem comes from the fact that the javacc objects used for mapping
>> triple patterns are not listed in the same order as in the original query
>> string. *SimpleStringQuerySerializer* serializes patterns into the ouput
>> string in the order returned by the javacc parser, and so the output string
>> won't always be equivalent to the source one. Moreover, parsing multiple
>> times the same query string will result in different output strings.
>>
>> This problem is even more annoying when executing (like in my case)
>> queries on graphs enanched with Pellet reasoner, because it has obviuos
>> difficulties in inferencing relations if the order of triple patterns in
>> the query is not the provided one.
>>
>> I solved the problem in my environment by simply saving the original
>> string into the parsed *Query *object and then making
>> *SimpleStringQuerySerializer* returns this string, without any processing.
>>
>> Can anyone take a look at the serializer to find a maybe better solution
>> to avoid this weird behaviour?
>>
>> Regards,
>> Giuseppe Miscione
>>
>>