There was some formatting issue in my previous mail. What I was wondering the need for grouping by ?r instead of ?ass.
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX cv: <http://www.semanticweb.org/toshiba/ontologies/2017/3/untitled-ontology-6#> INSERT { ?ass cv:recorded_speed ?avg . } WHERE { SELECT ?ass (AVG(?speed) AS ?avg) WHERE { ?v cv:vehicleSpeed ?speed ; cv:Vehicle_Road ?r . ?ass cv:avgSpeedSensor_Infrastructue ?r } GROUP BY ?r ?ass } On 09.06.2017 16:29, Lorenz Buehmann wrote: > That is your query: > > PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> > PREFIX cv: > <http://www.semanticweb.org/toshiba/ontologies/2017/3/untitled-ontology-6#> > > INSERT { > ?ass cv:recorded_speed ?avg . > } > WHERE > { SELECT (AVG(?speed) AS ?avg) > WHERE > { ?v cv:vehicleSpeed ?speed ; > cv:Vehicle_Road ?r > { SELECT ?r > WHERE > { ?ass cv:avgSpeedSensor_Infrastructue ?r } > } > } > GROUP BY ?r > } > > The problem is that you use for what ever reason a sub-SELECT to get the > ?ass value. But this value is not propagated to the outer query, thus, > it's not bound to the INSERT part. > > Why not do it like here (note, I dPREFIX rdf: > <http://www.w3.org/1999/02/22-rdf-syntax-ns#> > PREFIX cv: > <http://www.semanticweb.org/toshiba/ontologies/2017/3/untitled-ontology-6#> > > INSERT { > ?ass cv:recorded_speed ?avg . > } > WHERE > { SELECT ?ass (AVG(?speed) AS ?avg) > WHERE > { ?v cv:vehicleSpeed ?speed ; > cv:Vehicle_Road ?r . > ?ass cv:avgSpeedSensor_Infrastructue ?r > } > GROUP BY ?r ?ass > }on't know why you group by ?r instead of ?ass, thus, added both): > > > > > On 09.06.2017 14:22, Aya Hamdy wrote: >> Didn't know attachments are not allowed. >> This is a gist of the three files. >> https://gist.github.com/AyazzHamdy/faa14ebf46b0fe32689edc808dbf85d9 >> >> The code files are minimalist as you can see on the gist. Only the query is >> included and everything else is removed. I wanted to attach them as files >> to avoid clutter in the email. I believe things are more organized this way. >> >> The problem is in b.java file. The c.java file is just to prove that the >> individual parts of the query work together. And the OWL file is the one >> generated by Protege. It has no problems, but I have removed anything that >> is not needed for this specific query. >> >> I have also attached a file called "ont.owl (full)" which has the full >> ontology in case it is needed (which I think it is not needed, but just in >> case I misunderstand). >> >> Regards, >> >> On Fri, Jun 9, 2017 at 8:47 AM, Andy Seaborne <[email protected]> wrote: >> >>> Attachments don't get through to this list. >>> >>> Put them in a pastebin or guithub gist. >>> >>> However, if they are so large that inlining email in plain text is >>> impractical, than it suggests they are not minimal. >>> >>> Andy >>> >>> >>> >>> On 09/06/17 07:06, Lorenz Buehmann wrote: >>> >>>> You forgot the attachments... >>>> >>>> >>>> On 09.06.2017 03:02, Aya Hamdy wrote: >>>> >>>>> Attached is a file of my code and my ontology which I have imported on >>>>> Eclipse. >>>>> >>>>> I have finally fixed the null values issue. I am not sure if I >>>>> understood the cause of the nulls correctly. However, it got fixed >>>>> when I used a different way of making the ResultSet as shown below: >>>>> >>>>> Query query = QueryFactory.create(queryString1); >>>>> QueryExecution qexec= QueryExecutionFactory.create(query, >>>>> ontologyModel); >>>>> ResultSet results=qexec.execSelect(); >>>>> ResultSetFormatter.out(System.out, results, query); >>>>> qexec.close(); >>>>> I am including this bit of code here in case this helps someone else >>>>> in the future cause I could not find it easily. It can be found in >>>>> context in the attached c.java file. >>>>> >>>>> However, the original bigger problem still persists. The insert SPARQL >>>>> query still does not result in inserting the new desired subject >>>>> predicate object triple. No errors are generated which is I suppose a >>>>> good thing, but when I print the ontology after running the query, I >>>>> can see that the new triples are not added. >>>>> >>>>> Attached is the owl file and the java file (b.java). I have added >>>>> explanatory comments in the java file hoping to clarify what I am >>>>> trying to do here. >>>>> >>>>> Also, hoping to clarify matters a bit more, I have two average speed >>>>> sensors (speedSensor1 and speedSensor2) and I have two vehicles >>>>> (vehicle1 and vehicle2). speedSensor1 is attached to Road1 and >>>>> speedSensor2 is attached to Road2. vehicle1 is located on Road1 with >>>>> vehicleSpeed of 0 and vehicle2 is located on Road2 with vehicleSpeed >>>>> of 50. Only one vehicle is modeled to be located on each road in an >>>>> attempt to simplify things for now. >>>>> >>>>> The goal is to calculate the average of speeds of all vehicles on >>>>> road1 and assign it as the value of the object property called >>>>> recorded_speed of the speed sensor attached to the road which the >>>>> vehicles are on. Consequently, based on my modeling, after running >>>>> the query, speedSensor1 should have recorded_speed of 0 (since only >>>>> vehicle1 is on road1 to which speedSensor1 is attached and vehicle1 >>>>> has speed of 0) and speedSensor2 should have recorded_speed of 50 >>>>> (since only vehicle2 is on road2 to which speedSensor2 is attached and >>>>> vehicle2 has speed of 50). >>>>> >>>>> Also, attached is another java file (c.java) that has the results of >>>>> me breaking down the big query in b.java. >>>>> My suspicion is that the part where I am trying to invoke the insert >>>>> query is not working, but the way I built is based on StackOverflow >>>>> and it was supposedly working fine, so I am not sure what I am missing. >>>>> >>>>> Hope this gives you a picture of what is going on and hope you can >>>>> help me understand why I cannot get the query to update the ontology. >>>>> >>>>> >>>>> >>>>> >>>>> On Thu, Jun 8, 2017 at 5:29 PM, Lorenz Buehmann >>>>> <[email protected] >>>>> <mailto:[email protected]>> wrote: >>>>> >>>>> If results are bound it can't be a null value. Please show your >>>>> updated >>>>> code. >>>>> >>>>> >>>>> On 07.06.2017 14:58, Aya Hamdy wrote: >>>>> > Sorry about the x, It was a stupid mistake. But it is nit the >>>>> cause of the >>>>> > null. When I fixed it, the results of even the simplest queries >>>>> are still >>>>> > nulls. >>>>> > >>>>> > The code is not generating errors though, it is not generating >>>>> the proper >>>>> > results ... >>>>> > >>>>> > On Tue, Jun 6, 2017 at 9:13 AM, Andy Seaborne <[email protected] >>>>> <mailto:[email protected]>> wrote: >>>>> > >>>>> >> >>>>> >> On 06/06/17 00:26, Aya Hamdy wrote: >>>>> >> >>>>> >>> Ok. That sounds reasonable so I will work on breaking down my >>>>> chain of >>>>> >>> thought into smaller pieces. Thank you so much. >>>>> >>> >>>>> >>> I saw an example online where the query syntax is written as a >>>>> string on >>>>> >>> Jena. so my query now looks like this: >>>>> >>> >>>>> >> Use >>>>> >> >>>>> >> String.join("\n" >>>>> >> , "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns# >>>>> <http://www.w3.org/1999/02/22-rdf-syntax-ns#>>" >>>>> >> , "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns# >>>>> <http://www.w3.org/1999/02/22-rdf-syntax-ns#>>" >>>>> >> , "INSERT {", >>>>> >> ... >>>>> >> , "}" >>>>> >> ); >>>>> >> >>>>> >> then you will have newlines in the string and parser errors >>>>> will have >>>>> >> line+column numbers that are useful. >>>>> >> >>>>> >> Andy >>>>> >> >>>>> >> >>>>> >> >>>>> >>> String queryString= >>>>> >>> "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns# >>>>> <http://www.w3.org/1999/02/22-rdf-syntax-ns#>>"+ >>>>> >>> "PREFIX cv:< >>>>> >>> >>>>> http://www.semanticweb.org/toshiba/ontologies/2017/3/untitl >>>>> ed-ontology-6# >>>>> <http://www.semanticweb.org/toshiba/ontologies/2017/3/untit >>>>> led-ontology-6#> >>>>> >>>> "+ >>>>> >>> "insert {"+ >>>>> >>> " ?ass cv:recorded_speed ?avg"+ >>>>> >>> "}"+ >>>>> >>> "WHERE {"+ >>>>> >>> "SELECT (AVG(?speed) AS ?avg) "+ >>>>> >>> "where{"+ >>>>> >>> " ?v rdf:type cv:Vehicle ;"+ >>>>> >>> "cv:vehicleSpeed ?speed;"+ >>>>> >>> " cv:Vehicle_Road ?r;"+ >>>>> >>> "{"+ >>>>> >>> >>>>> >>> "SELECT ?r"+ >>>>> >>> "where{"+ >>>>> >>> >>>>> >>> "?ass rdf:type cv:Avg_Speed_Sensor;"+ >>>>> >>> " cv:avgSpeedSensor_Infrastructure ?r"+ >>>>> >>> "}"+ >>>>> >>> "}"+ >>>>> >>> >>>>> >>> >>>>> >>> >>>>> >>> "}"+"GROUP By ?ass ?avg ?r"+ >>>>> >>> "}"; >>>>> >>> >>>>> >>> Then, also based on my research, I feed the query string into >>>>> the parser >>>>> >>> and output the model. >>>>> >>> UpdateAction.parseExecute( queryString, ontologyModel ); >>>>> >>> ontologyModel.write( System.out, "TTL" ); >>>>> >>> I encountered many errors but managed to get rid of them all. >>>>> However, >>>>> >>> based on the output, nothing has changed. speedSensor1 and >>>>> speedSensor2 >>>>> >>> do >>>>> >>> not have the recorded_speed property added. >>>>> >>> >>>>> >>> Of course, I tried debugging, but I could not get any >>>>> understanding of the >>>>> >>> problem. >>>>> >>> >>>>> >>> >>>>> >>> I tried breaking the query down to smaller bits right down to >>>>> doing a >>>>> >>> simple select on vehicles: >>>>> >>> >>>>> >>> String query1= >>>>> >>> "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns# >>>>> <http://www.w3.org/1999/02/22-rdf-syntax-ns#>>"+ >>>>> >>> "PREFIX cv:< >>>>> >>> >>>>> http://www.semanticweb.org/toshiba/ontologies/2017/3/untitl >>>>> ed-ontology-6# >>>>> <http://www.semanticweb.org/toshiba/ontologies/2017/3/untit >>>>> led-ontology-6#> >>>>> >>>> "+ >>>>> >>> "Select ?v"+ >>>>> >>> "where {"+ >>>>> >>> "?v cv:vehicleSpeed ?speed."+ >>>>> >>> "}"; >>>>> >>> >>>>> >>> Query query = QueryFactory.create(query1); >>>>> >>> QueryExecution qexec= QueryExecutionFactory.create(query, >>>>> ontologyModel); >>>>> >>> try{ >>>>> >>> ResultSet results=qexec.execSelect(); >>>>> >>> while(results.hasNext()){ >>>>> >>> QuerySolution soln=results.nextSolution(); >>>>> >>> org.apache.jena.rdf.model.Literal name = soln.getLiteral("x"); >>>>> >>> System.out.println(name); >>>>> >>> } >>>>> >>> }finally{ >>>>> >>> qexec.close(); >>>>> >>> } >>>>> >>> But everything I have tried yields in the result "null". >>>>> >>> >>>>> >>> Can you give me pointers on how I should go about trying to >>>>> figure out the >>>>> >>> problem with the insert function? >>>>> >>> Sorry if my questions are too naive, but I am trying to grasp >>>>> the concepts >>>>> >>> as much as possible. >>>>> >>> >>>>> >>> Best Regards, >>>>> >>> Aya >>>>> >>> >>>>> >>> >>>>> >>> >>>>> >>> >>>>> >>> On Mon, Jun 5, 2017 at 8:32 PM, Andy Seaborne <[email protected] >>>>> <mailto:[email protected]>> wrote: >>>>> >>> >>>>> >>> Then find the sensor of interest, and all cars on that given >>>>> road. >>>>> >>>> GROUP BY the speed sensor, and the AVG is that of calls on >>>>> that given >>>>> >>>> road. >>>>> >>>> >>>>> >>>> The way to develop complex queris is to write simple parts, >>>>> then combine >>>>> >>>> them. >>>>> >>>> >>>>> >>>> Andy >>>>> >>>> >>>>> >>>> >>>>> >>>> On 05/06/17 16:46, Aya Hamdy wrote: >>>>> >>>> >>>>> >>>> The goal is not to calculate the avg speed of a car. It is >>>>> rather to >>>>> >>>>> compute the avg speed of all the cars on a given road and >>>>> assign that >>>>> >>>>> computed average as the reading of the average speed sensot >>>>> attached to >>>>> >>>>> that road. >>>>> >>>>> >>>>> >>>>> Sorry if my wording is causing confusion. >>>>> >>>>> >>>>> >>>>> On Jun 5, 2017 5:12 PM, "Lorenz Buehmann" < >>>>> >>>>> [email protected] >>>>> <mailto:[email protected]>> wrote: >>>>> >>>>> >>>>> >>>>> No, why do you think so? ?v is the variable that gets >>>>> assigned a vehicle >>>>> >>>>> >>>>> >>>>>> for which you compute the avg speed. >>>>> >>>>>> >>>>> >>>>>> <Instance> should be ?v, i.e. you have to group by it and >>>>> select it >>>>> >>>>>> >>>>> >>>>>> INSERT { >>>>> >>>>>> >>>>> >>>>>> ?v :avgSpeed ?avg >>>>> >>>>>> >>>>> >>>>>> } WHERE { >>>>> >>>>>> >>>>> >>>>>> SELECT ?v (AVG(?speed) AS ?avg) { >>>>> >>>>>> >>>>> >>>>>> .... >>>>> >>>>>> >>>>> >>>>>> } GROUP BY ?v >>>>> >>>>>> >>>>> >>>>>> } >>>>> >>>>>> >>>>> >>>>>> >>>>> >>>>>> On 05.06.2017 17:03, Aya Hamdy wrote: >>>>> >>>>>> >>>>> >>>>>> Hello, >>>>> >>>>>>> I will try to explain with examples. I have generated my >>>>> ontology from >>>>> >>>>>>> Protege and converted it to turtle syntax via an online >>>>> tool. >>>>> >>>>>>> >>>>> >>>>>>> *I have a class for average speed sensors:* >>>>> >>>>>>> >>>>> >>>>>>> ### >>>>> >>>>>>> http://www.semanticweb.org/toshiba/ontologies/2017/3/ >>>>> <http://www.semanticweb.org/toshiba/ontologies/2017/3/> >>>>> >>>>>>> >>>>> >>>>>>> untitled-ontology-6#Avg_Speed_Sensor >>>>> >>>>>> >>>>> >>>>>>> untitled-ontology-6:Avg_Speed_Sensor rdf:type owl:Class ; >>>>> >>>>>>> >>>>> >>>>>>> rdfs:subClassOf >>>>> >>>>>>> untitled-ontology-6:Sensor , >>>>> >>>>>>> >>>>> >>>>>>> untitled-ontology-6:Speed_Sensor . >>>>> >>>>>>> >>>>> >>>>>>> *and a class for vehicles:* >>>>> >>>>>>> ### >>>>> >>>>>>> http://www.semanticweb.org/toshiba/ontologies/2017/3/ >>>>> <http://www.semanticweb.org/toshiba/ontologies/2017/3/> >>>>> >>>>>>> >>>>> >>>>>>> untitled-ontology-6#Vehicle >>>>> >>>>>> >>>>> >>>>>>> untitled-ontology-6:Vehicle rdf:type owl:Class . >>>>> >>>>>>> >>>>> >>>>>>> *The vehicle class has a property called vehicleSpeed:* >>>>> >>>>>>> ### >>>>> >>>>>>> http://www.semanticweb.org/toshiba/ontologies/2017/3/ >>>>> <http://www.semanticweb.org/toshiba/ontologies/2017/3/> >>>>> >>>>>>> >>>>> >>>>>>> untitled-ontology-6#vehicleSpeed >>>>> >>>>>> >>>>> >>>>>>> untitled-ontology-6:vehicleSpeed rdf:type >>>>> owl:DatatypeProperty ; >>>>> >>>>>>> >>>>> >>>>>>> rdfs:domain >>>>> >>>>>>> untitled-ontology-6:Vehicle >>>>> >>>>>>> >>>>> >>>>>>> ; >>>>> >>>>>> >>>>> >>>>>>> rdfs:range xsd:integer . >>>>> >>>>>>> >>>>> >>>>>>> *The avg speed sensor class has a property called >>>>> recorded_speed:* >>>>> >>>>>>> >>>>> >>>>>>> ### >>>>> >>>>>>> http://www.semanticweb.org/toshiba/ontologies/2017/3/ >>>>> <http://www.semanticweb.org/toshiba/ontologies/2017/3/> >>>>> >>>>>>> >>>>> >>>>>>> untitled-ontology-6#recorded_speed >>>>> >>>>>> >>>>> >>>>>>> untitled-ontology-6:recorded_speed rdf:type >>>>> owl:DatatypeProperty ; >>>>> >>>>>>> >>>>> >>>>>>> rdfs:domain >>>>> >>>>>>> >>>>> >>>>>>> untitled-ontology-6:Sensor , >>>>> >>>>>> >>>>> >>>>>>> untitled-ontology-6:Speed_Sensor ; >>>>> >>>>>>> >>>>> >>>>>>> rdfs:range xsd:integer >>>>> . >>>>> >>>>>>> >>>>> >>>>>>> The recorded speed by the avg speed sensor allocated to a >>>>> specific >>>>> >>>>>>> road >>>>> >>>>>>> >>>>> >>>>>>> is >>>>> >>>>>> the average of the vehicleSpeeds of the vehicles on that >>>>> specific road, >>>>> >>>>>>> where the avg speed sensor class has a property called >>>>> >>>>>>> avgSpeedSensor_Infrastructure and the vehicle has a >>>>> property called >>>>> >>>>>>> Vehicle_Road. >>>>> >>>>>>> >>>>> >>>>>>> I have two vehicle instances: Vehicle1 and Vehicle2; and >>>>> two sensor >>>>> >>>>>>> instances: SpeedSensor1 and SpeedSensor2. >>>>> >>>>>>> >>>>> >>>>>>> Is it clearer now or just confusing? >>>>> >>>>>>> >>>>> >>>>>>> so I am guessing following your guide it would be >>>>> something like: >>>>> >>>>>>> >>>>> >>>>>>> INSERT { >>>>> >>>>>>> <instance> :avgSpeed ?avg >>>>> >>>>>>> } >>>>> >>>>>>> WHERE { >>>>> >>>>>>> SELECT (AVG(?speed) AS ?avg) { >>>>> >>>>>>> ?v rdf:type :Vehicle ; >>>>> >>>>>>> :vehicleSpeed ?speed; >>>>> >>>>>>> : Vehicle_Road ?r; >>>>> >>>>>>> ?avs rdf:type :Avg_Speed_Sensor; >>>>> >>>>>>> :avgSpeedSensor_Infrastructure ?r >>>>> >>>>>>> >>>>> >>>>>>> } >>>>> >>>>>>> } >>>>> >>>>>>> >>>>> >>>>>>> But the value of the <instance> should come from reading >>>>> the file, >>>>> >>>>>>> >>>>> >>>>>>> right? >>>>> >>>>>> >>>>> >>>>>>> On Sun, Jun 4, 2017 at 9:04 PM, Andy Seaborne >>>>> <[email protected] <mailto:[email protected]>> >>>>> >>>>>>> wrote: >>>>> >>>>>>> >>>>> >>>>>>> >>>>> >>>>>>> On 04/06/17 18:47, Aya Hamdy wrote: >>>>> >>>>>>>> Hello, >>>>> >>>>>>>> >>>>> >>>>>>>>> I wanted to add a property called avgSpeed to an >>>>> instance of a class >>>>> >>>>>>>>> called >>>>> >>>>>>>>> FlowSensor. This property should be the average of the >>>>> values of the >>>>> >>>>>>>>> property vehicleSpeed attached to instances of the class >>>>> Vehicle. >>>>> >>>>>>>>> >>>>> >>>>>>>>> I read that SPARQL update allows doing this. However, I >>>>> cannot reach >>>>> >>>>>>>>> >>>>> >>>>>>>>> the >>>>> >>>>>> syntax for doing the* averaging of values* or for building >>>>> the *SPARQL >>>>> >>>>>>>> Update *query using jena with eclipse on the jena website. >>>>> >>>>>>>>> If Jena indeed supports doing what I intend to do then >>>>> can someone >>>>> >>>>>>>>> >>>>> >>>>>>>>> point >>>>> >>>>>> out some sources to guide me in my attempt? >>>>> >>>>>>>>> Best Regards, >>>>> >>>>>>>>> Aya >>>>> >>>>>>>>> >>>>> >>>>>>>>> >>>>> >>>>>>>>> Calculate the average in a nested select so somethign >>>>> like (you'll >>>>> >>>>>>>>> >>>>> >>>>>>>> have >>>>> >>>>>>>> >>>>> >>>>>>>> to >>>>> >>>>>> fix this up): >>>>> >>>>>>>> INSERT { >>>>> >>>>>>>> <instance> :avgSpeed ?avg >>>>> >>>>>>>> } >>>>> >>>>>>>> WHERE { >>>>> >>>>>>>> SELECT (AVG(?speed) AS ?avg) { >>>>> >>>>>>>> ?v rdf:type :Vehicle ; >>>>> >>>>>>>> :vehicleSpeed ?speed >>>>> >>>>>>>> } >>>>> >>>>>>>> } >>>>> >>>>>>>> >>>>> >>>>>>>> By the way - it is better to more concrete in your >>>>> description - >>>>> >>>>>>>> actual >>>>> >>>>>>>> data for example. >>>>> >>>>>>>> >>>>> >>>>>>>> >>>>> >>>>>>>> >>>>> >>>>>> >>>>> >>>>> >>>>>
