" cv:Vehicle_Road ?r ;"+

Bad syntax. Replace ";" by "."

Lorenz showed you the correct syntax.

        "?ass cv:avgSpeedSensor_Infrastructue ?r ."+

Print the query out and see what it looks like. Hence the earlier suggestion you put newlines in the query.

   Andy

~2800 lines is not a minimal example.

On 09/06/17 15:53, Aya Hamdy wrote:
When I do not use the subselect and write the query this way:

String queryString1 =
"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) {"+
          "?v cv:vehicleSpeed ?speed;"+
          " cv:Vehicle_Road ?r ;"+
         "?ass cv:avgSpeedSensor_Infrastructue ?r ."+



       "}"+ "GROUP BY ?r ?ass"+
       "}";

The code generates the error below when it tries to execute the update
action:
Exception in thread "main" org.apache.jena.query.QueryParseException:
Encountered " <VAR1> "?r "" at line 1, column 299.
Was expecting one of:
     "values" ...
     "graph" ...
     "optional" ...
     "minus" ...
     "bind" ...
     "service" ...
     "filter" ...
     "{" ...
     "}" ...
     ";" ...
     "," ...
     "." ...

When I researched these options under "Was expecting one of:",  I did not
find one of those options that would fit my query.
I need this line:   "?ass cv:avgSpeedSensor_Infrastructue ?r ." to ensure
that the sensor is attached to the road on which the car is on.

I group by ?r to try to ensure that the grouping is per road as well. But I
think you have a point, and I should group by the sensor as well.

Note: when I write the " cv:Vehicle_Road ?r ;"+      line with a full stop
instead of a full stop the error goes away, but still, nothing happens in
the owl file. Meaning, the new tuple is not added either. (I am a bit
confused as to when to put a ";" and when to put a "." I believe, as far as
my understanding goes, when I put a "." in the end of the
" cv:Vehicle_Road ?r " the error goes away because the last line   "?ass
cv:avgSpeedSensor_Infrastructue ?r ." is ignored in the first place. could
you confirm or negate that?)

Your help is truly much appreciated.

On Fri, Jun 9, 2017 at 2:30 PM, Lorenz Buehmann <
buehm...@informatik.uni-leipzig.de> wrote:

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 <a...@apache.org> 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
<buehm...@informatik.uni-leipzig.de
<mailto:buehm...@informatik.uni-leipzig.de>> 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 <
a...@apache.org
      <mailto:a...@apache.org>> 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 <
a...@apache.org
      <mailto:a...@apache.org>> 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" <
      >>>>> buehm...@informatik.uni-leipzig.de
      <mailto:buehm...@informatik.uni-leipzig.de>> 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
      <a...@apache.org <mailto:a...@apache.org>>
      >>>>>>> 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.
      >>>>>>>>
      >>>>>>>>
      >>>>>>>>
      >>>>>>






Reply via email to