use of org.openrdf.query.algebra.ExtensionElem in project incubator-rya by apache.
the class HasSelfVisitor method meetSP.
@Override
protected void meetSP(final StatementPattern node) throws Exception {
final URI pred = (URI) node.getPredicateVar().getValue();
final Var obj = node.getObjectVar();
// if originalSP like (?s rdf:type :C1): require that C1 is defined, i.e. not a variable
// node <- originalSP
final StatementPattern clone = node.clone();
if (RDF.TYPE.equals(pred) && obj.isConstant()) {
// for property in getHasSelfImplyingType(C1):
if (obj.getValue() instanceof URI) {
for (final URI property : inferenceEngine.getHasSelfImplyingType((URI) obj.getValue())) {
// node <- InferUnion(node, StatementPattern(?s, property, ?s)).
final InferUnion union = new InferUnion(clone, new StatementPattern(clone.getSubjectVar(), new Var(property.stringValue(), property), clone.getSubjectVar()));
// originalSP.replaceWith(node)
node.replaceWith(union);
}
}
// else if originalSP like (s :p o): where p is not a variable and at least one of s and o are variables
} else if (node.getPredicateVar().isConstant() && (!node.getSubjectVar().isConstant() || !node.getObjectVar().isConstant())) {
// for type in getHasSelfImplyingProperty(p):
for (final Resource type : inferenceEngine.getHasSelfImplyingProperty(pred)) {
final Extension extension;
if (obj.isConstant()) {
// subject is the variable
// Extension(StatementPattern(o, rdf:type, type), ExtensionElem(o, "s"))
extension = new Extension(new StatementPattern(obj, TYPE_VAR, new Var(type.stringValue(), type)), new ExtensionElem(obj, node.getSubjectVar().getName()));
} else {
// o is a variable and s may either be defined or a variable
// Extension(StatementPattern(s, rdf:type, type), ExtensionElem(s, "o"))
extension = new Extension(new StatementPattern(node.getSubjectVar(), TYPE_VAR, new Var(type.stringValue(), type)), new ExtensionElem(node.getSubjectVar(), obj.getName()));
}
// node <- InferUnion(node, newNode)
final InferUnion union = new InferUnion(extension, clone);
node.replaceWith(union);
}
}
}
use of org.openrdf.query.algebra.ExtensionElem in project incubator-rya by apache.
the class ConstructConsequentVisitor method recordConsequent.
private void recordConsequent(ProjectionElemList variables, List<ExtensionElem> extensionElements) {
Map<String, Value> bindings = new ConcurrentHashMap<>();
Map<String, Value> values = new ConcurrentHashMap<>();
Set<String> queryBnodes = new HashSet<>();
Set<String> projectedBnodes = new HashSet<>();
for (ExtensionElem ee : extensionElements) {
if (ee.getExpr() instanceof ValueConstant) {
bindings.put(ee.getName(), ((ValueConstant) ee.getExpr()).getValue());
} else if (ee.getExpr() instanceof BNodeGenerator) {
queryBnodes.add(ee.getName());
}
}
for (ProjectionElem var : variables.getElements()) {
String sourceName = var.getSourceName();
String targetName = var.getTargetName();
Value constValue = bindings.get(sourceName);
if (constValue != null) {
values.put(targetName, constValue);
} else if (queryBnodes.contains(sourceName)) {
projectedBnodes.add(targetName);
}
}
Var subjVar = new Var(SUBJECT_VAR_NAME, values.get(SUBJECT_VAR_NAME));
Var predVar = new Var(PREDICATE_VAR_NAME, values.get(PREDICATE_VAR_NAME));
Var objVar = new Var(OBJECT_VAR_NAME, values.get(OBJECT_VAR_NAME));
subjVar.setAnonymous(projectedBnodes.contains(SUBJECT_VAR_NAME));
predVar.setAnonymous(projectedBnodes.contains(PREDICATE_VAR_NAME));
objVar.setAnonymous(projectedBnodes.contains(OBJECT_VAR_NAME));
StatementPattern sp = new StatementPattern(subjVar, predVar, objVar);
consequentStatementPatterns.add(sp);
}
use of org.openrdf.query.algebra.ExtensionElem in project incubator-rya by apache.
the class ConstructConsequentVisitorTest method testConcreteSP.
@Test
public void testConcreteSP() {
Extension extension = new Extension(new SingletonSet(), new ExtensionElem(new ValueConstant(FOAF.PERSON), "x"), new ExtensionElem(new ValueConstant(RDF.TYPE), "y"), new ExtensionElem(new ValueConstant(OWL.CLASS), "z"));
Projection projection = new Projection(extension, new ProjectionElemList(new ProjectionElem("x", "subject"), new ProjectionElem("y", "predicate"), new ProjectionElem("z", "object")));
ConstructConsequentVisitor visitor = new ConstructConsequentVisitor();
projection.visit(visitor);
Set<StatementPattern> expected = Sets.newHashSet(new StatementPattern(s(FOAF.PERSON), p(RDF.TYPE), o(OWL.CLASS)));
Assert.assertEquals(expected, visitor.getConsequents());
}
use of org.openrdf.query.algebra.ExtensionElem in project incubator-rya by apache.
the class ConstructConsequentVisitorTest method testMissingVariables.
@Test
public void testMissingVariables() {
Extension extension = new Extension(new SingletonSet(), new ExtensionElem(new ValueConstant(FOAF.PERSON), "x"), new ExtensionElem(new ValueConstant(RDF.TYPE), "y"));
Projection projection = new Projection(extension, new ProjectionElemList(new ProjectionElem("x", "s"), new ProjectionElem("y", "predicate"), new ProjectionElem("z", "object")));
ConstructConsequentVisitor visitor = new ConstructConsequentVisitor();
projection.visit(visitor);
Set<StatementPattern> expected = Sets.newHashSet(new StatementPattern(s(null), p(RDF.TYPE), o(null)));
Assert.assertEquals(expected, visitor.getConsequents());
}
use of org.openrdf.query.algebra.ExtensionElem in project incubator-rya by apache.
the class MultiProjectionEvaluator method make.
/**
* Make a {@link MultiProjectionEvaluator} that processes the logic of a {@link MultiProjection}.
*
* @param multiProjection - Defines the projections that will be processed. (not null)
* @param bNodeIdFactory - Creates the IDs for Blank Nodes. (not null)
* @return A {@link MultiProjectionEvaluator} for the provided {@link MultiProjection}.
*/
public static MultiProjectionEvaluator make(final MultiProjection multiProjection, final BNodeIdFactory bNodeIdFactory) {
requireNonNull(multiProjection);
// Figure out if there are extensions.
final TupleExpr arg = multiProjection.getArg();
final Optional<Extension> extension = (arg instanceof Extension) ? Optional.of((Extension) arg) : Optional.empty();
// If there are, iterate through them and find any blank node source names.
final Set<String> blankNodeSourceNames = new HashSet<>();
if (extension.isPresent()) {
for (final ExtensionElem elem : extension.get().getElements()) {
if (elem.getExpr() instanceof BNodeGenerator) {
blankNodeSourceNames.add(elem.getName());
}
}
}
// Create a ProjectionEvaluator for each projection that is part of the multi.
final Set<ProjectionEvaluator> projections = new HashSet<>();
for (final ProjectionElemList projectionElemList : multiProjection.getProjections()) {
projections.add(new ProjectionEvaluator(projectionElemList, extension));
}
return new MultiProjectionEvaluator(projections, blankNodeSourceNames, bNodeIdFactory);
}
Aggregations