SPARQL: Choose one triple from multiple match? Supplementation

…衆ロ難τιáo~ 提交于 2019-12-25 08:25:53

问题


I have a query for updating my RDF database. The problem is that ?Terminal2 block of query is returning two different ?Terminal2's (both match the query) and that is making my code useless. I would need to somehow limit it for only one ?Terminal2 - doesn't matter which one. When I put this code to TopBraid, I get only one line in output so the LIMIT is working for the whole code not just for that subquery. Do you have any idea how to make my code working? There were some ideas about using SAMPLE. (I had opened similar question here.)

DELETE 
{ 
  ?Terminal1 blb:Terminal.ConnectivityNode ?T2 .
}
INSERT 
{ 
  ?Terminal1 blb:Terminal.ConnectivityNode ?T2_new .
  ?Terminal2 blb:used ?used .
  ?Terminal3 blb:used ?used .
  ?T2 blb:used ?used .
}

WHERE
{ 
  ?Terminal1 rdf:type blb:Terminal .
  ?Terminal1 blb:IdentifiedObject.name "T2" .
  ?Terminal1 blb:Terminal.ConnectivityNode ?T2 .
  ?Terminal1 blb:IdentifiedObject.description ?desc .

  FILTER(?desc != "Evo") .    
  BIND(("Used") as ?used) .

  {
    select * WHERE 
    {
      ?Terminal2 rdf:type blb:Terminal .
      ?Terminal2 blb:IdentifiedObject.name "T2" .
      ?Terminal2 blb:IdentifiedObject.description "Evo" .
      ?Terminal2 blb:Terminal.ConductingEquipment ?Parent .
      ?Terminal2 blb:Terminal.ConnectivityNode ?T2 .
    }
    limit 1
  }

  ?Terminal3 rdf:type blb:Terminal .
  ?Terminal3 blb:IdentifiedObject.name "T1" .
  ?Terminal3 blb:IdentifiedObject.description "Evo" .
  ?Terminal3 blb:Terminal.ConductingEquipment ?Parent .
  ?Terminal3 blb:Terminal.ConnectivityNode ?T2_new .

  OPTIONAL 
  {
    ?T2 rdf:type blb:ConnectivityNode .
  }
}

Thanks for help!

This code below works (exactly as I need) in TopBraid (with SELECT *), but not as DELETE/INSERT query. The error is Exception in thread "main" com.hp.hpl.jena.query.QueryParseException: Encountered " <INTEGER> "1 "" at line 1, column 1040.

DELETE 
{ 
  ?Terminal1 blb:Terminal.ConnectivityNode ?T2 .
}
INSERT 
{ 
  ?Terminal1 blb:Terminal.ConnectivityNode ?T2_new .
  ?Terminal2 blb:used ?used .
  ?Terminal3 blb:used ?used .
  ?T2 blb:used ?used .
}
WHERE  
{       ?Terminal1 rdf:type blb:Terminal .
        ?Terminal1 blb:IdentifiedObject.name "T2" .
        ?Terminal1 blb:Terminal.ConnectivityNode ?T2 .
        ?Terminal1 blb:IdentifiedObject.description ?desc .
        FILTER(?desc != "EVO") .
        BIND(("Used") as ?used) .

    {
        select ?Terminal2 (SAMPLE(?Parent2) AS ?Parent ) WHERE 
       {
        ?Terminal2 rdf:type blb:Terminal .
        ?Terminal2 blb:IdentifiedObject.name "T2" .
        ?Terminal2 blb:IdentifiedObject.description "EVO" .
        ?Terminal2 blb:Terminal.ConductingEquipment ?Parent2 .
        ?Terminal2 blb:Terminal.ConnectivityNode ?T2 .
       }
        GROUP BY ?Terminal2
        LIMIT 1
    }
        ?Terminal3 rdf:type blb:Terminal .
        ?Terminal3 blb:IdentifiedObject.name "T1" .
        ?Terminal3 blb:IdentifiedObject.description "EVO" .
        ?Terminal3 blb:Terminal.ConductingEquipment ?Parent .
        ?Terminal3 blb:Terminal.ConnectivityNode ?T2_new .

        OPTIONAL{?T2 rdf:type blb:ConnectivityNode .}
}

来源:https://stackoverflow.com/questions/38967938/sparql-choose-one-triple-from-multiple-match-supplementation

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!