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]> 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]> 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#>" > >> , "PREFIX rdf:<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#>"+ > >>> "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 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#>"+ > >>> "PREFIX cv:< > >>> http://www.semanticweb.org/toshiba/ontologies/2017/3/ > untitled-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]> 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]> 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/ > >>>>>>> > >>>>>>> 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/ > >>>>>>> > >>>>>>> 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/ > >>>>>>> > >>>>>>> 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/ > >>>>>>> > >>>>>>> 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]> > >>>>>>> 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. > >>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>> > >
