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 :("); }; } } }