001package org.dllearner.algorithms.qtl.util.filters; 002 003import org.apache.jena.graph.Node; 004import org.apache.jena.vocabulary.RDF; 005import org.dllearner.algorithms.qtl.QueryTreeUtils; 006import org.dllearner.algorithms.qtl.datastructures.NodeInv; 007import org.dllearner.algorithms.qtl.datastructures.impl.RDFResourceTree; 008import org.dllearner.algorithms.qtl.operations.traversal.PostOrderTreeTraversal; 009import org.dllearner.algorithms.qtl.operations.traversal.PostOrderTreeTraversal2; 010import org.dllearner.algorithms.qtl.operations.traversal.PreOrderTreeTraversal; 011import org.dllearner.algorithms.qtl.operations.traversal.TreeTraversal; 012 013import java.util.List; 014import java.util.Set; 015import java.util.SortedSet; 016 017/** 018 * 019 * Drops edges v1 -p-> v2 if 020 * p is symmetric and 021 * there is an edge v -p-> v1 with l(v)=l(v2) 022 * 023 * @author Lorenz Buehmann 024 */ 025public class SymmetricPredicatesFilter extends AbstractTreeFilter<RDFResourceTree> { 026 027 private final Set<Node> symmetricPredicates; 028 029 public SymmetricPredicatesFilter(Set<Node> symmetricPredicates) { 030 this.symmetricPredicates = symmetricPredicates; 031 } 032 033 public boolean isSymmetric(Node edge) { 034 return symmetricPredicates != null && symmetricPredicates.contains(edge); 035 } 036 037 @Override 038 public RDFResourceTree apply(RDFResourceTree tree) { 039 RDFResourceTree newTree = new RDFResourceTree(tree, true); 040 041 TreeTraversal<RDFResourceTree> it = new PostOrderTreeTraversal2<>(tree); 042 043 while(it.hasNext()) { 044 RDFResourceTree child = it.next(); 045 046 if(!child.isRoot()) { 047 Node edge = child.getEdgeToParent(); 048 049 boolean incoming = edge instanceof NodeInv; 050 051 if(incoming) { 052 edge = ((NodeInv) edge).getNode(); 053 } 054 055 if(isSymmetric(edge)) { 056 RDFResourceTree parent = child.getParent(); 057 System.out.println(parent + "(" + parent.getID() + ") --" + edge + "--" + child + "(" + child.getID() + ")"); 058 059 List<RDFResourceTree> children; 060 if(incoming) { 061 children = parent.getChildren(edge); 062 } else { 063 children = parent.getChildren(new NodeInv(edge)); 064 } 065 066 boolean subsumed = children != null && children.stream().anyMatch(otherChild -> QueryTreeUtils.isSubsumedBy(child, otherChild)); 067 068 if(children != null) { 069 for (RDFResourceTree otherChild : children) { 070 System.out.println(otherChild + " (" + otherChild.getID() + "):" + QueryTreeUtils.isSubsumedBy(child, otherChild)); 071 } 072 } 073 074 if(subsumed) { 075 it.remove(); 076 } 077 } 078 } 079 } 080 081 return newTree; 082 } 083}