问题
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