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.misci...@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.misci...@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.miscione@**innovationengineering.eu<g.misci...@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.miscione@**innovationengineering.eu<g.misci...@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
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>

Reply via email to