Github user meiercaleb commented on a diff in the pull request: https://github.com/apache/incubator-rya/pull/206#discussion_r133467895 --- Diff: sail/src/main/java/org/apache/rya/rdftriplestore/inference/InferenceEngine.java --- @@ -416,22 +425,131 @@ private void refreshHasValueRestrictions(Map<Resource, URI> restrictions) throws } } - private static Vertex getVertex(Graph graph, Object id) { - Iterator<Vertex> it = graph.vertices(id.toString()); + private void refreshIntersectionOf() throws QueryEvaluationException { + final Map<Resource, List<Set<Resource>>> intersectionsProp = new HashMap<>(); + + // First query for all the owl:intersectionOf's. + // If we have the following intersectionOf: + // :A owl:intersectionOf[:B, :C] + // It will be represented by triples following a pattern similar to: + // <:A> owl:intersectionOf _:bnode1 . + // _:bnode1 rdf:first <:B> . + // _:bnode1 rdf:rest _:bnode2 . + // _:bnode2 rdf:first <:C> . + // _:bnode2 rdf:rest rdf:nil . + ryaDaoQueryWrapper.queryAll(null, OWL.INTERSECTIONOF, null, new RyaDaoStatementIterHandler() { + @Override + public void handleStatementIter(final Statement st1) throws Exception { + final Resource type = st1.getSubject(); + // head will point to a type that is part of the intersection. + URI head = (URI) st1.getObject(); + if (!intersectionsProp.containsKey(type)) { + intersectionsProp.put(type, new ArrayList<Set<Resource>>()); + } + final Set<Resource> intersection = new HashSet<>(); + // Go through and find all bnodes that are part of the defined + // intersection. + while (!RDF.NIL.equals(head)) { + // rdf.first will point to a type item that is in the + // intersection. + ryaDaoQueryWrapper.queryFirst(head, RDF.FIRST, null, new RyaDaoStatementIterHandler() { + @Override + public void handleStatementIter(final Statement st2) throws Exception{ + // The object found in the query represents a type + // that should be included in the intersection. + final URI obj2 = (URI) st2.getObject(); + intersection.add(obj2); + } + }); + final List<URI> headHolder = new ArrayList<>(1); + // rdf.rest will point to the next bnode that's part of the + // intersection. + ryaDaoQueryWrapper.queryFirst(head, RDF.REST, null, new RyaDaoStatementIterHandler() { + @Override + public void handleStatementIter(final Statement st3) throws Exception { + // This object is the next bnode head to look for. + final URI obj3 = (URI) st3.getObject(); + headHolder.add(obj3); + } + }); + // As long as we get a new head there are more bnodes that + // are part of the intersection. Keep going until we reach + // rdf.nil. + if (!headHolder.isEmpty()) { + head = headHolder.get(0); + } else { + head = RDF.NIL; + } + } + // Add this intersection for this type. There may be more + // intersections for this type so each type has a list of + // intersection sets. + intersectionsProp.get(type).add(intersection); --- End diff -- Thanks for clarifying the need for the list of sets.
--- If your project is set up for it, you can reply to this email and have your reply appear on GitHub as well. If your project does not have this feature enabled and wishes so, or if the feature is enabled but not working, please contact infrastructure at infrastruct...@apache.org or file a JIRA ticket with INFRA. ---