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}