I try the two queries in my Java project (I usea ARQ 2.8.8 and Fuseki 0.2.2) using with JUnit test. With the FILTER NOT EXISTS sentece takes 0.724s (or less) querying the roots in RadLex Ontology ( 234.442 triples), with the MINUS sentence takes 56.762s (even more)...
2012/7/5 Andy Seaborne <[email protected]> > On 05/07/12 18:30, Milorad Tosic wrote: > >> Would there by any differences in performance or eventually in result set >> if we would substitute >> FILTER NOT EXISTS { ?root rdfs:subClassOf ?super } >> with >> >> MINUS { ?root rdfs:subClassOf ?super } >> in the previous query? >> >> Milorad >> > > Depends - also the required temporary memory needed is different. The > MINUS implement is quite performant now (previously it would have been the > case the FILTER version was faster). > > The FILTER version streams - constant memory overhead. > > The MINUS version uses temporary RAM - in proportion to the size of the > data matched. > > If there are a lot of rdfs:subClassOf, e.g. have expanded the inferences > previous, it could be the MINUS version is slower. > > You'll have to try to be definitive. If you try, do let us know. > > Andy > > > >> >> >> ______________________________**__ >>> From: Federico López <[email protected]> >>> To: [email protected] >>> Sent: Thursday, July 5, 2012 5:28 PM >>> Subject: Re: I need to get the root element of a ontology >>> >>> 2012/7/5 Andy Seaborne <[email protected]> >>> >>> On 05/07/12 06:49, Federico López wrote: >>>> >>>> I looking for a good quey that allows me to get the roots elements of a >>>>> Ontology. Also, I need to know wich one of these roots have children... >>>>> >>>>> >>>>> >>>>> Version of Jena used? >>>> I'm using fuseki 0.2.2... >>>> >>>> I have each ontology in a NAMED GRAPH.... >>>> >>>>> >>>>> >>>> And you are querying the union graph? >>>> >>> >>> >>> I'm Querying each GRAPH at time... >>> >>> >>>> >>>> >>>> This is what I using for it but the query is taking too much. >>>>> >>>>> >>>> How big is the data (in triples)? >>>> >>>> Well... I'm querying Biomedical Ontologies like FMA(1'859.969 >>> triples), >>> RadLex(234.442), ICD10(165.310)... >>> >>> >>>> Are you using inference? >>>> >>> >>> I don't.... >>> >>> >>>> >>>> >>>> SELECT DISTINCT ?root ?label (COUNT(?child) AS ?nChild) >>>>> FROM <http://ontologyURI> >>>>> WHERE >>>>> { >>>>> ?root a ?class . >>>>> ?class rdfs:subClassOf owl:Class . >>>>> ?root rdfs:label ?label . >>>>> OPTIONAL { >>>>> ?root rdfs:subClassOf ?super . >>>>> } >>>>> OPTIONAL { >>>>> ?child rdfs:subClassOf ?root . >>>>> } >>>>> FILTER (!bound(?super)) >>>>> } >>>>> GROUP BY ?root ?label >>>>> >>>>> Any idea? >>>>> >>>>> Thanks... >>>>> >>>>> >>>>> >>>>> without inference, this maybe what you want: I'm guessing from your >>>> description: >>>> >>>> SELECT ?root >>>> { >>>> # A root is something that is of type class >>>> # which has no super class mentioned. >>>> ?root rdf:type owl:Class . >>>> FILTER NOT EXISTS { ?root rdfs:subClassOf ?super } >>>> >>>> ?root rdfs:label ?label . >>>> } >>>> >>>> Adding in the COUNT of ?child and GROUP BY is unlikely to be cheap. >>>> >>>> SELECT ?root (COUNT(DISTINCT ?child) AS ?nChild) >>>> { >>>> # A root is something that is of type class >>>> # which has no super class mentioned. >>>> ?root rdf:type owl:Class . >>>> FILTER NOT EXISTS { ?root rdfs:subClassOf ?super } >>>> >>>> ?root rdfs:label ?label . >>>> # Children, any depth, by property paths >>>> OPTIONAL { ?child rdfs:subClassOf+ ?root } >>>> } >>>> GROUP BY ?root >>>> Andy >>>> >>>> >>> And thanks, I going to try your query, but I think that is just that I >>> need >>> :D >>> >>> -- >>> *FEDERICO LÓPEZ GÓMEZ* >>> Estudiante Ingeniería de Sistemas >>> Universidad del Valle - Sede Tuluá >>> >>> >>> >>> > > -- *FEDERICO LÓPEZ GÓMEZ* Estudiante Ingeniería de Sistemas Universidad del Valle - Sede Tuluá
