This is an automated email from the ASF dual-hosted git repository.
afs pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/jena.git
The following commit(s) were added to refs/heads/main by this push:
new 2ae015ae7f GH 1361 Respect the filterFunctors flag during backward
chaining
2ae015ae7f is described below
commit 2ae015ae7f791b1ff606c1c3cbb1f61a0c6c03db
Author: Thomas Thelen <[email protected]>
AuthorDate: Wed Jun 24 12:51:53 2026 -0700
GH 1361 Respect the filterFunctors flag during backward chaining
---
.../jena/reasoner/rulesys/GenericRuleReasoner.java | 1 +
.../reasoner/rulesys/LPBackwardRuleInfGraph.java | 17 +++++++++++++-
.../reasoner/rulesys/test/TestGenericRules.java | 27 ++++++++++++++++++++++
3 files changed, 44 insertions(+), 1 deletion(-)
diff --git
a/jena-core/src/main/java/org/apache/jena/reasoner/rulesys/GenericRuleReasoner.java
b/jena-core/src/main/java/org/apache/jena/reasoner/rulesys/GenericRuleReasoner.java
index e7f303a497..9513b44aa0 100644
---
a/jena-core/src/main/java/org/apache/jena/reasoner/rulesys/GenericRuleReasoner.java
+++
b/jena-core/src/main/java/org/apache/jena/reasoner/rulesys/GenericRuleReasoner.java
@@ -387,6 +387,7 @@ public class GenericRuleReasoner extends FBRuleReasoner {
} else if (mode == BACKWARD) {
graph = new LPBackwardRuleInfGraph(this, getBruleStore(), data,
schemaArg);
((LPBackwardRuleInfGraph)graph).setTraceOn(traceOn);
+
((LPBackwardRuleInfGraph)graph).setFunctorFiltering(filterFunctors);
} else {
List<Rule> ruleSet = ((FBRuleInfGraph)schemaArg).getRules();
FBRuleInfGraph fbgraph = new FBRuleInfGraph(this, ruleSet,
schemaArg);
diff --git
a/jena-core/src/main/java/org/apache/jena/reasoner/rulesys/LPBackwardRuleInfGraph.java
b/jena-core/src/main/java/org/apache/jena/reasoner/rulesys/LPBackwardRuleInfGraph.java
index 718a8206b9..a511dc4c53 100644
---
a/jena-core/src/main/java/org/apache/jena/reasoner/rulesys/LPBackwardRuleInfGraph.java
+++
b/jena-core/src/main/java/org/apache/jena/reasoner/rulesys/LPBackwardRuleInfGraph.java
@@ -58,6 +58,9 @@ public class LPBackwardRuleInfGraph extends BaseInfGraph
implements BackwardRule
/** Cache of temporary property values inferred through getTemp calls */
protected TempNodeCache tempNodecache;
+ /** Flag, if true then functor-valued literals are filtered from find
results */
+ protected boolean filterFunctors = true;
+
static Logger logger =
LoggerFactory.getLogger(LPBackwardRuleInfGraph.class);
// =======================================================================
@@ -172,7 +175,11 @@ public class LPBackwardRuleInfGraph extends BaseInfGraph
implements BackwardRule
if (continuation != null) {
result = result.andThen(continuation.find(pattern));
}
- return result.filterDrop(Functor.acceptFilter);
+ if (filterFunctors) {
+ return result.filterDrop(Functor.acceptFilter);
+ } else {
+ return result;
+ }
}
/**
@@ -260,6 +267,14 @@ public class LPBackwardRuleInfGraph extends BaseInfGraph
implements BackwardRule
}
}
+ /**
+ * Set to true to cause functor-valued literals to be dropped from rule
output.
+ * Default is true.
+ */
+ public void setFunctorFiltering(boolean param) {
+ filterFunctors = param;
+ }
+
/**
* Set the state of the trace flag. If set to true then rule firings
* are logged out to the Log at "INFO" level.
diff --git
a/jena-core/src/test/java/org/apache/jena/reasoner/rulesys/test/TestGenericRules.java
b/jena-core/src/test/java/org/apache/jena/reasoner/rulesys/test/TestGenericRules.java
index 583a2e1742..55877c4c91 100644
---
a/jena-core/src/test/java/org/apache/jena/reasoner/rulesys/test/TestGenericRules.java
+++
b/jena-core/src/test/java/org/apache/jena/reasoner/rulesys/test/TestGenericRules.java
@@ -325,6 +325,33 @@ public class TestGenericRules extends TestCase {
} );
}
+ /**
+ * Test that functor filtering is honored in backward mode.
+ */
+ public void testBackwardFunctorFilter() {
+ Graph data = createGraphForTest();
+ data.add(Triple.create(a, r, b));
+ data.add(Triple.create(a, p, s));
+ List<Rule> rules = Rule.parseRules( "[r0: (?x q func(?y, ?z)) <- (?x r
?y) (?x p ?z)]" );
+ GenericRuleReasoner reasoner =
(GenericRuleReasoner)GenericRuleReasonerFactory.theInstance().create(null);
+ reasoner.setRules(rules);
+ reasoner.setMode(GenericRuleReasoner.BACKWARD);
+
+ // Default: functors are filtered out
+ InfGraph infgraph = reasoner.bind(data);
+ TestUtil.assertIteratorValues(this,
+ infgraph.find(null, q, null), new Object[] {
+ } );
+
+ // With filtering disabled: functor triples should be visible
+ reasoner.setFunctorFiltering(false);
+ infgraph = reasoner.bind(data);
+ TestUtil.assertIteratorValues(this,
+ infgraph.find(null, q, null), new Object[] {
+ Triple.create(a, q, Functor.makeFunctorNode("func", new
Node[]{b, s}))
+ } );
+ }
+
/**
* Test recursive rules involving functors
* May lock up in there is a bug.