Hi,
I am extracting the subjects,predicates and objects in queries in log by
using this handy snippet here [1]. My goal is to compare them with other
sets of Nodes coming from other sources.
However, the .equals between the Node coming from the snippet and a Node
created with NodeFactory is not working as expected. Roughly:
Node var = NodeFactory.createVariable("movie");
QueryStr = "SELECT ?movie WHERE {?movie .......}" ;
Got the subjects of the query with [1], that is, a set containing the
variable '?movie' (let's call it 'sub')
My issue is that sub.equals(var) is false when I expected the opposite.
What I'm missing here?
I'm attaching a minimal test case for those keen to execute it.
Regards,
Luis.
P.S. ARQ 3.1.0 from maven repo on Java 8, if it matters.
[1]
http://stackoverflow.com/questions/15203838/how-to-get-all-of-the-subjects-of-a-jena-query
--
Ing. Luis Daniel Ibáñez G.
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package soton.wais.queryanalyzer;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Objects;
import java.util.Set;
import org.apache.jena.graph.Node;
import org.apache.jena.graph.NodeFactory;
import org.apache.jena.query.Query;
import org.apache.jena.query.QueryFactory;
import org.apache.jena.sparql.core.TriplePath;
import org.apache.jena.sparql.syntax.ElementPathBlock;
import org.apache.jena.sparql.syntax.ElementVisitorBase;
import org.apache.jena.sparql.syntax.ElementWalker;
/**
*
* @author ldig
*/
public class MUTCNodeEquality {
public static Set<Node> getSubjects(Query query){
final Set<Node> subjects = new HashSet<>();
// This will walk through all parts of the query
ElementWalker.walk(query.getQueryPattern(),
// For each element...
new ElementVisitorBase() {
// ...when it's a block of triples...
@Override
public void visit(ElementPathBlock el) {
// ...go through all the triples...
Iterator<TriplePath> triples = el.patternElts();
while (triples.hasNext()) {
// ...and grab the subject
subjects.add(triples.next().getSubject());
}
}
}
);
return subjects;
}
public static void main(String[] args){
Query q = QueryFactory.create("PREFIX dbo:<http://dbpedia.org/ontology/#>" +
" SELECT ?movie (avg(?runtime) as ?avgrt) WHERE {" +
"?movie dbo:runtime ?runtime ." +
"?movie dbo:starring <http://dbpedia.org/resource/Jason_Statham>" +
"} GROUP BY ?movie");
Set<Node> subjects = getSubjects(q);
// result is {?movie}
Node s = NodeFactory.createVariable("movie");
Iterator<Node> iter = subjects.iterator();
while(iter.hasNext()){
Node node = iter.next();
if(node.equals(s)){
System.out.println("Nodes are equal, same label");
}else{
System.out.println("Same label, but not equal :(");
};
}
}
}