package org.aksw.jena_sparql_api.sparql_path2; import java.util.Set; import org.aksw.jena_sparql_api.shape.ResourceShapeBuilder; import org.aksw.jena_sparql_api.utils.ExprListUtils; import org.aksw.jena_sparql_api.utils.Pair; import org.aksw.jena_sparql_api.utils.Vars; import org.apache.jena.graph.Node; import org.apache.jena.sparql.expr.E_NotOneOf; import org.apache.jena.sparql.expr.Expr; import org.apache.jena.sparql.expr.ExprVar; import org.apache.jena.sparql.path.P_Link; import org.apache.jena.sparql.path.P_NegPropSet; import org.apache.jena.sparql.path.P_ReverseLink; import org.apache.jena.sparql.path.PathVisitorBase; public class PathVisitorResourceShapeBuilder extends PathVisitorBase { protected ResourceShapeBuilder rsb; protected boolean reverse; public PathVisitorResourceShapeBuilder() { this(new ResourceShapeBuilder(), false); } public PathVisitorResourceShapeBuilder(boolean reverse) { this(new ResourceShapeBuilder(), reverse); } public PathVisitorResourceShapeBuilder(ResourceShapeBuilder rsb, boolean reverse) { super(); this.rsb = rsb; this.reverse = reverse; } public ResourceShapeBuilder getResourceShapeBuilder() { return rsb; } @Override public void visit(P_ReverseLink path) { rsb.nav(path.getNode(), !reverse); } @Override public void visit(P_Link path) { rsb.nav(path.getNode(), reverse); } @Override public void visit(P_NegPropSet path) { if(!path.getFwdNodes().isEmpty()) { Expr expr = new E_NotOneOf(new ExprVar(Vars.p), ExprListUtils.nodesToExprs(path.getFwdNodes())); rsb.nav(expr, reverse); } if(!path.getBwdNodes().isEmpty()) { Expr expr = new E_NotOneOf(new ExprVar(Vars.p), ExprListUtils.nodesToExprs(path.getBwdNodes())); rsb.nav(expr, !reverse); } } public static void apply(ResourceShapeBuilder rsb, ValueSet<Node> valueSet, boolean reverse) { boolean isPositive = valueSet.isPositive(); Set<Node> nodes = valueSet.getValues(); if(isPositive) { for(Node value : nodes) { rsb.nav(value, reverse); } } else { if(!nodes.isEmpty()) { Expr expr = new E_NotOneOf(new ExprVar(Vars.p), ExprListUtils.nodesToExprs(nodes)); rsb.nav(expr, !reverse); } } } public static void apply(ResourceShapeBuilder rsb, Pair<ValueSet<Node>> predicateClass, boolean reverse) { apply(rsb, predicateClass.getKey(), !reverse); apply(rsb, predicateClass.getValue(), reverse); } }