Class OpUtils
java.lang.Object
org.aksw.jena_sparql_api.algebra.utils.OpUtils
-
Nested Class Summary
Nested Classes -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic VarUsageanalyzeVarUsage(org.aksw.commons.collections.trees.Tree<org.apache.jena.sparql.algebra.Op> tree, org.apache.jena.sparql.algebra.Op current) static VarUsageanalyzeVarUsage(org.aksw.commons.collections.trees.Tree<org.apache.jena.sparql.algebra.Op> tree, org.apache.jena.sparql.algebra.Op current, Set<org.apache.jena.sparql.core.Var> availableVars) static VarUsageanalyzeVarUsage(org.aksw.commons.collections.trees.Tree<org.apache.jena.sparql.algebra.Op> tree, org.apache.jena.sparql.algebra.Op current, VarUsageAnalyzerVisitor visitor) Maybe we need to change the method to is compatible(Treetree, Op op, Set vars, boolean distinct) Analyze a node of a tree for which of its variables are required for evaluation in other portions of the query. static org.apache.jena.sparql.algebra.OpapplyExtendProject(org.apache.jena.sparql.algebra.Op result, Map<org.apache.jena.sparql.core.Var, org.apache.jena.sparql.expr.Expr> map) Apply project and extend as neededstatic org.apache.jena.sparql.algebra.Opstatic org.apache.jena.sparql.algebra.OpcopyOnChange(org.apache.jena.sparql.algebra.Op op, List<org.apache.jena.sparql.algebra.Op> subOps) static org.apache.jena.sparql.algebra.op.OpTablecreateEmptyTableUnionVars(org.apache.jena.sparql.algebra.Op... subOps) static org.aksw.commons.collections.trees.Tree<org.apache.jena.sparql.algebra.Op>createTree(org.apache.jena.sparql.algebra.Op rootOp) static org.apache.jena.sparql.algebra.OpextendWithVarMap(org.apache.jena.sparql.algebra.Op subOp, Map<org.apache.jena.sparql.core.Var, org.apache.jena.sparql.core.Var> oldToNew) Low level function that simply turns a var-map into an project(extend()) expression.org.apache.jena.sparql.algebra.Opfactorize(org.apache.jena.sparql.algebra.Op op, com.google.common.collect.BiMap<org.apache.jena.sparql.core.Var, org.apache.jena.sparql.algebra.Op> cxt, org.apache.jena.sparql.core.VarAlloc varAlloc, org.aksw.commons.util.algebra.ExprFilter<org.apache.jena.sparql.algebra.Op> isBlocker) Allocate a single variable for every unique expression.static org.aksw.commons.collections.generator.Generator<org.apache.jena.sparql.core.Var>freshVars(org.apache.jena.sparql.algebra.Op op) static Stringstatic OpUtils.OpOpsgetOpOps()static List<org.apache.jena.sparql.algebra.Op>getSubOps(org.apache.jena.sparql.algebra.Op op) static List<org.apache.jena.sparql.algebra.Op>getUnionMembers(org.apache.jena.sparql.algebra.Op op) static Stream<org.apache.jena.sparql.algebra.Op>inOrderSearch(org.apache.jena.sparql.algebra.Op op, Predicate<org.apache.jena.sparql.algebra.Op> predicate) static booleanisEquivalent(org.apache.jena.sparql.algebra.Op a, org.apache.jena.sparql.algebra.Op b) static booleanisNoPattern(org.apache.jena.sparql.algebra.Op op) Test whether the given Op is an empty BGP or a unit table.static booleanisPatternFree(org.apache.jena.sparql.algebra.Op op) Traverses an op structure in order to determine whether it contains any concrete triple or quad patterns.static booleanisServiceFree(org.apache.jena.sparql.algebra.Op op) static booleanisServiceWithIri(org.apache.jena.sparql.algebra.Op op, String iri) Return true iff op is an OpService with the given iristatic booleanisUnitTable(org.apache.jena.sparql.algebra.Op op) static Stream<org.apache.jena.sparql.algebra.Op>linearizePrefix(org.apache.jena.sparql.algebra.Op op) static Map<org.apache.jena.sparql.algebra.Op,org.apache.jena.sparql.algebra.Op> parentMap(org.apache.jena.sparql.algebra.Op rootOp) Traverse an op structure and create a map from each subOp to its immediate parent NOTE It must be ensured that common sub expressions are different objects, since we are using an identity hash map for mapping children to parentsstatic org.apache.jena.sparql.algebra.Oplongsize(org.apache.jena.sparql.algebra.Op op) Count the number of operators in an op expression TODO Add versions that support a predicate on whether to descend into an op, such as SERVICEstatic org.apache.jena.sparql.algebra.Opsubstitute(org.apache.jena.sparql.algebra.Op op, boolean descendIntoSubst, Function<? super org.apache.jena.sparql.algebra.Op, ? extends org.apache.jena.sparql.algebra.Op> transformFn) Perform a top-down substitutionstatic org.apache.jena.sparql.algebra.Opsubstitute(org.apache.jena.sparql.algebra.Op op, org.apache.jena.sparql.algebra.Op searchNode, org.apache.jena.sparql.algebra.Op newNode) In the expression op, find the node searchNode and replace it with newNodestatic org.apache.jena.sparql.algebra.OptoOp(Iterable<org.apache.jena.sparql.core.Quad> quads, BiFunction<org.apache.jena.graph.Node, org.apache.jena.sparql.core.BasicPattern, org.apache.jena.sparql.algebra.Op> opFactory) Suggested arguments for opFactory: OpQuadPattern::new OpUtils::toOpGraphTriplesstatic org.apache.jena.sparql.algebra.OptoOp(Map<org.apache.jena.graph.Node, org.apache.jena.sparql.core.BasicPattern> map, BiFunction<org.apache.jena.graph.Node, org.apache.jena.sparql.core.BasicPattern, org.apache.jena.sparql.algebra.Op> opFactory) static org.apache.jena.sparql.algebra.Opstatic org.apache.jena.sparql.algebra.OptoOp(QuadFilterPattern qfp) static org.apache.jena.sparql.algebra.Opstatic org.apache.jena.sparql.algebra.OptoOpGraphTriples(org.apache.jena.graph.Node graphNode, org.apache.jena.sparql.core.BasicPattern bgp) static Set<org.apache.jena.sparql.core.Var>visibleNamedVars(org.apache.jena.sparql.algebra.Op op) Like OpVars.visibleVars, but filters out non-named vars Filter out non-named varsstatic org.apache.jena.sparql.algebra.OpwrapWithProjection(org.apache.jena.sparql.algebra.Op subOp, Map<org.apache.jena.sparql.core.Var, org.apache.jena.sparql.core.Var> oldToNew) safe version of extend with varMap - renames any colliding var names Select (?o As ?s) (?s As ?o) { ?s ?p ?o } -> Select (?o as ?v1) (?s As ?v2) { ?s ?p ?o } -> Select (?v1 As ?s) (?v2 As ?o) { { Select (?o as ?v1) ...
-
Constructor Details
-
OpUtils
public OpUtils()
-
-
Method Details
-
getOpOps
-
createEmptyTableUnionVars
public static org.apache.jena.sparql.algebra.op.OpTable createEmptyTableUnionVars(org.apache.jena.sparql.algebra.Op... subOps) -
isNoPattern
public static boolean isNoPattern(org.apache.jena.sparql.algebra.Op op) Test whether the given Op is an empty BGP or a unit table. Code copied / factored out fromTransformQuadGraph -
visibleNamedVars
public static Set<org.apache.jena.sparql.core.Var> visibleNamedVars(org.apache.jena.sparql.algebra.Op op) Like OpVars.visibleVars, but filters out non-named vars Filter out non-named vars- Parameters:
op-- Returns:
-
getUnionMembers
public static List<org.apache.jena.sparql.algebra.Op> getUnionMembers(org.apache.jena.sparql.algebra.Op op) -
extendWithVarMap
public static org.apache.jena.sparql.algebra.Op extendWithVarMap(org.apache.jena.sparql.algebra.Op subOp, Map<org.apache.jena.sparql.core.Var, org.apache.jena.sparql.core.Var> oldToNew) Low level function that simply turns a var-map into an project(extend()) expression. It is recommended to use wrapWithProjection which deals with variable name clashes in the renaming.- Parameters:
subOp-oldToNew-- Returns:
-
wrapWithProjection
public static org.apache.jena.sparql.algebra.Op wrapWithProjection(org.apache.jena.sparql.algebra.Op subOp, Map<org.apache.jena.sparql.core.Var, org.apache.jena.sparql.core.Var> oldToNew) safe version of extend with varMap - renames any colliding var names Select (?o As ?s) (?s As ?o) { ?s ?p ?o } -> Select (?o as ?v1) (?s As ?v2) { ?s ?p ?o } -> Select (?v1 As ?s) (?v2 As ?o) { { Select (?o as ?v1) ... } }- Parameters:
subOp-oldToNew-- Returns:
-
applyExtendProject
public static org.apache.jena.sparql.algebra.Op applyExtendProject(org.apache.jena.sparql.algebra.Op result, Map<org.apache.jena.sparql.core.Var, org.apache.jena.sparql.expr.Expr> map) Apply project and extend as needed- Parameters:
subOp-map-- Returns:
-
size
public long size(org.apache.jena.sparql.algebra.Op op) Count the number of operators in an op expression TODO Add versions that support a predicate on whether to descend into an op, such as SERVICE- Parameters:
op-- Returns:
-
linearizePrefix
public static Stream<org.apache.jena.sparql.algebra.Op> linearizePrefix(org.apache.jena.sparql.algebra.Op op) -
freshVars
public static org.aksw.commons.collections.generator.Generator<org.apache.jena.sparql.core.Var> freshVars(org.apache.jena.sparql.algebra.Op op) -
substitute
public static org.apache.jena.sparql.algebra.Op substitute(org.apache.jena.sparql.algebra.Op op, boolean descendIntoSubst, Function<? super org.apache.jena.sparql.algebra.Op, ? extends org.apache.jena.sparql.algebra.Op> transformFn) Perform a top-down substitution- Parameters:
op-descendIntoSubst-opToSubst-- Returns:
-
substitute
public static org.apache.jena.sparql.algebra.Op substitute(org.apache.jena.sparql.algebra.Op op, org.apache.jena.sparql.algebra.Op searchNode, org.apache.jena.sparql.algebra.Op newNode) In the expression op, find the node searchNode and replace it with newNode- Parameters:
op-descendIntoSubst-searchNode-- Returns:
-
getClassLabel
-
isEquivalent
public static boolean isEquivalent(org.apache.jena.sparql.algebra.Op a, org.apache.jena.sparql.algebra.Op b) -
parentMap
public static Map<org.apache.jena.sparql.algebra.Op,org.apache.jena.sparql.algebra.Op> parentMap(org.apache.jena.sparql.algebra.Op rootOp) Traverse an op structure and create a map from each subOp to its immediate parent NOTE It must be ensured that common sub expressions are different objects, since we are using an identity hash map for mapping children to parents- Parameters:
op-- Returns:
-
createTree
public static org.aksw.commons.collections.trees.Tree<org.apache.jena.sparql.algebra.Op> createTree(org.apache.jena.sparql.algebra.Op rootOp) -
copyOnChange
public static org.apache.jena.sparql.algebra.Op copyOnChange(org.apache.jena.sparql.algebra.Op op, List<org.apache.jena.sparql.algebra.Op> subOps) -
copy
public static org.apache.jena.sparql.algebra.Op copy(org.apache.jena.sparql.algebra.Op op, List<org.apache.jena.sparql.algebra.Op> subOps) -
getSubOps
public static List<org.apache.jena.sparql.algebra.Op> getSubOps(org.apache.jena.sparql.algebra.Op op) -
isPatternFree
public static boolean isPatternFree(org.apache.jena.sparql.algebra.Op op) Traverses an op structure in order to determine whether it contains any concrete triple or quad patterns. If no such pattern is found, the query is independent of a dataset and hence it can be evaluated e.g. against an empty in-memory model. TODO Maybe rephrase the condition as: An op is pattern free if there is no OpService and all leaf nodes are OpTable.- Parameters:
op-- Returns:
-
inOrderSearch
-
isServiceFree
public static boolean isServiceFree(org.apache.jena.sparql.algebra.Op op) -
isServiceWithIri
Return true iff op is an OpService with the given iri -
analyzeVarUsage
public static VarUsage analyzeVarUsage(org.aksw.commons.collections.trees.Tree<org.apache.jena.sparql.algebra.Op> tree, org.apache.jena.sparql.algebra.Op current, VarUsageAnalyzerVisitor visitor) Maybe we need to change the method to is compatible(Treetree, Op op, Set vars, boolean distinct) Analyze a node of a tree for which of its variables are required for evaluation in other portions of the query. Also keep track of which set of variables is affected by the first parent distinct operation. Note: A projection does not imply reference of a variable: A variable is only referenced if it is required for evaluating an expression or join, or if it is part of the final result. Scoping: If we have Extend(?x := ?o * 2, { ?s ?p ?o }) Then a reference of ?x implies a use of ?o So we can do bookkeeping with a multimap that maps each (possibly newly introduced) variable to the set of referenced original variables Goal: Given: View Query: Select Distinct ?s { ?s a Foo } User Query: Select Distinct ?s { { ?s a Foo } UNION { ?s a Bar } } support injecting the view query into the user query: Select Distinct ?s { viewRef(viewId, {?s}) UNION { ?s a Bar } } Note: If the User Query was without Distinct, there would be no match Distinct ( Project(?s ?o, Union ( BGP(?s a Foo), // As only ?s is projected and ?o is unbound, the distinct ?s trivially satisfies distinct ?s ?o BGP(?s ?p ?o), ) ) ) Variables that are used in aggregate expressions must not be distinct - unless there is an appropriate distinct sub op We could have: Select (?s as ?o) (?o As ?s) { ?s ?p ?o } (virtuoso 7.2 accepts this, but gets it wrong) In this case we would get the dependencies: { ?o -> { ?s }, ?s -> { ?o } } The thing we have to take care of is, that the extend node may 'kill' prior variable definitions - Parameters:
tree-current-- Returns:
-
analyzeVarUsage
public static VarUsage analyzeVarUsage(org.aksw.commons.collections.trees.Tree<org.apache.jena.sparql.algebra.Op> tree, org.apache.jena.sparql.algebra.Op current) -
analyzeVarUsage
-
toOp
-
toOp
-
project
public static org.apache.jena.sparql.algebra.Op project(org.apache.jena.sparql.algebra.Op op, Iterable<org.apache.jena.sparql.core.Var> vars) -
toOp
-
toOpGraphTriples
public static org.apache.jena.sparql.algebra.Op toOpGraphTriples(org.apache.jena.graph.Node graphNode, org.apache.jena.sparql.core.BasicPattern bgp) -
toOp
public static org.apache.jena.sparql.algebra.Op toOp(Map<org.apache.jena.graph.Node, org.apache.jena.sparql.core.BasicPattern> map, BiFunction<org.apache.jena.graph.Node, org.apache.jena.sparql.core.BasicPattern, org.apache.jena.sparql.algebra.Op> opFactory) -
toOp
public static org.apache.jena.sparql.algebra.Op toOp(Iterable<org.apache.jena.sparql.core.Quad> quads, BiFunction<org.apache.jena.graph.Node, org.apache.jena.sparql.core.BasicPattern, org.apache.jena.sparql.algebra.Op> opFactory) Suggested arguments for opFactory: OpQuadPattern::new OpUtils::toOpGraphTriples- Parameters:
quads-opFactory-- Returns:
-
factorize
public org.apache.jena.sparql.algebra.Op factorize(org.apache.jena.sparql.algebra.Op op, com.google.common.collect.BiMap<org.apache.jena.sparql.core.Var, org.apache.jena.sparql.algebra.Op> cxt, org.apache.jena.sparql.core.VarAlloc varAlloc, org.aksw.commons.util.algebra.ExprFilter<org.apache.jena.sparql.algebra.Op> isBlocker) Allocate a single variable for every unique expression. Main use case is common sub expression elimination. -
isUnitTable
public static boolean isUnitTable(org.apache.jena.sparql.algebra.Op op)
-