jena クエリ オブジェクトがあるとします。
String query = "SELECT * WHERE{ ?s <some_uri> ?o ...etc. }";
Query q = QueryFactory.create(query, Syntax.syntaxARQ);
ElementWalker を使用して、次のようにトリプルをクエリに追加したいと思います。
与えられたクエリ
SELECT * WHERE {
?s ?p ?o;
?p2 ?o2.
?s2 ?p3 ?o3.
}
クエリが次のようになるトリプル st を追加したいと思います。
SELECT * WHERE {
?s ?p ?o;
?p2 ?o2.
-->?s <some_url> "value". //added
?s2 ?p3 ?o3.
}
トップレベル ( Jena Tutorial )に追加する方法があることは知っていますが、ElementWalker を使用してトリプルをウォークスルーする際に、何らかの方法でトリプルを追加したいと考えています。
ElementWalker.walk(query.getQueryPattern(), new ElementVisitorBase(){
public void visit(ElementPathBlock el) {
// when it's a block of triples, add in some triple
ElementPathBlock elCopy = new ElementPathBlock();
Iterator<TriplePath> triples = el.patternElts();
int index = 0;
int numAdded = 0;
while (triples.hasNext()) {
TriplePath t = triples.next();
if(t.getSubject().equals(/*something*/)){
//add triple here, something like:
elCopy.addTriple(index+numAdded, /*someTriple*/);
numAdded++;
}
index++;
}
el = elCopy;
}
public void visit(ElementSubQuery el) {
// get the subquery and walk it
ElementGroup subQP = (ElementGroup) el.getQuery().getQueryPattern();
ElementWalker.walk(subQP, this);
}
public void visit(ElementOptional el) {
// get optional elements and walk them
Element optionalQP = el.getOptionalElement();
ElementWalker.walk(optionalQP, this);
}
});
上記のコードの問題は、トリプルを ElementPathBlock ( el
) に正常に追加することですが、変更がクエリ自体まで永続化されないことです。私の希望は、クエリ内のこの特定の ElementPathBlock にアクセスしながら、クエリを正常に変更することです。
どんな助けでも感謝します。