This is an automated email from the ASF dual-hosted git repository.
andy 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 ab887fd599 GH-1720: Filter out literals-as-subjects from --rdfs
ab887fd599 is described below
commit ab887fd59911628124267e3570591dc9d9e3691b
Author: Andy Seaborne <[email protected]>
AuthorDate: Sat Jan 18 11:01:34 2025 +0000
GH-1720: Filter out literals-as-subjects from --rdfs
---
.../java/org/apache/jena/rdfs/RDFSFactory.java | 6 ++
.../main/java/org/apache/jena/rdfs/SetupRDFS.java | 8 --
.../org/apache/jena/riot/system/StreamRDF2.java | 6 +-
.../org/apache/jena/sparql/modify/TemplateLib.java | 4 +-
.../org/apache/jena/sparql/util/ModelUtils.java | 72 +++++++-------
.../org/apache/jena/sparql/util/NodeUtils.java | 66 +++++++++++++
.../java/org/apache/jena/arq/ARQTestSuite.java | 12 ++-
.../java/org/apache/jena/util/TS_UtilsARQ.java} | 30 ++----
.../java/org/apache/jena/util/TestNodeUtils.java | 106 +++++++++++++++++++++
jena-cmds/src/main/java/riotcmd/CmdLangParse.java | 13 ++-
10 files changed, 240 insertions(+), 83 deletions(-)
diff --git a/jena-arq/src/main/java/org/apache/jena/rdfs/RDFSFactory.java
b/jena-arq/src/main/java/org/apache/jena/rdfs/RDFSFactory.java
index aaf101e70f..37e42fe723 100644
--- a/jena-arq/src/main/java/org/apache/jena/rdfs/RDFSFactory.java
+++ b/jena-arq/src/main/java/org/apache/jena/rdfs/RDFSFactory.java
@@ -22,6 +22,7 @@ import org.apache.jena.query.Dataset;
import org.apache.jena.query.DatasetFactory;
import org.apache.jena.riot.system.StreamRDF;
import org.apache.jena.sparql.core.DatasetGraph;
+import org.apache.jena.sparql.util.NodeUtils;
/** Factory for data+RDFS inference. */
public class RDFSFactory {
@@ -79,4 +80,9 @@ public class RDFSFactory {
public static StreamRDF streamRDFS(StreamRDF data, SetupRDFS setup) {
return new InfStreamRDFS(data, setup);
}
+
+ /** RDFS can generate "symmetric RDF", "generalized RDF" - e.g. triples
with literals as subjects. */
+ public static StreamRDF removeGeneralizedRDF(StreamRDF data) {
+ return NodeUtils.removeGeneralizedRDF(data);
+ }
}
diff --git a/jena-arq/src/main/java/org/apache/jena/rdfs/SetupRDFS.java
b/jena-arq/src/main/java/org/apache/jena/rdfs/SetupRDFS.java
index 84cc71cc7a..9f9dc90d60 100644
--- a/jena-arq/src/main/java/org/apache/jena/rdfs/SetupRDFS.java
+++ b/jena-arq/src/main/java/org/apache/jena/rdfs/SetupRDFS.java
@@ -24,14 +24,6 @@ import org.apache.jena.rdfs.setup.BaseSetupRDFS;
/** RDFS setup in Node space */
public class SetupRDFS extends BaseSetupRDFS<Node> {
- /**
- * {@code incDerivedDataRDFS} causes the engine to look for RDFS
relationships in the data
- * as if TBox (rules) and ABox (ground data) are one unit.
- * <p>
- * Set true if abox == tbox.
- * <p>
- * Can choose false or true if abox != tbox.
- */
public SetupRDFS(Graph vocab) {
super(vocab);
}
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/StreamRDF2.java
b/jena-arq/src/main/java/org/apache/jena/riot/system/StreamRDF2.java
index e066ccc613..7b8c4d2a51 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/StreamRDF2.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/StreamRDF2.java
@@ -21,8 +21,8 @@ package org.apache.jena.riot.system;
import org.apache.jena.graph.Triple ;
import org.apache.jena.sparql.core.Quad ;
-/** Send to two stream */
-public class StreamRDF2 implements StreamRDF
+/** Send to two streams */
+public class StreamRDF2 implements StreamRDF
{
protected final StreamRDF sink1 ;
protected final StreamRDF sink2 ;
@@ -31,7 +31,7 @@ public class StreamRDF2 implements StreamRDF
this.sink1 = sink1 ;
this.sink2 = sink2 ;
}
-
+
@Override
public void start() {
sink1.start() ;
diff --git
a/jena-arq/src/main/java/org/apache/jena/sparql/modify/TemplateLib.java
b/jena-arq/src/main/java/org/apache/jena/sparql/modify/TemplateLib.java
index a9a9b880f1..bf2026174f 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/modify/TemplateLib.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/modify/TemplateLib.java
@@ -30,7 +30,7 @@ import org.apache.jena.sparql.core.Quad;
import org.apache.jena.sparql.core.Substitute;
import org.apache.jena.sparql.core.Var;
import org.apache.jena.sparql.engine.binding.Binding;
-import org.apache.jena.sparql.util.ModelUtils;
+import org.apache.jena.sparql.util.NodeUtils;
public class TemplateLib {
// See also Substitute -- combine?
@@ -79,7 +79,7 @@ public class TemplateLib {
List<Triple> tripleList = new ArrayList<>(triples.size());
for ( Triple triple : triples ) {
Triple q = subst(triple, b, bNodeMap);
- if ( !q.isConcrete() ||
!ModelUtils.isValidAsStatement(q.getSubject(), q.getPredicate(), q.getObject())
) {
+ if ( !q.isConcrete() || !
NodeUtils.isValidAsRDF(q.getSubject(), q.getPredicate(), q.getObject()) ) {
// Log.warn(TemplateLib.class, "Unbound quad:
// "+FmtUtils.stringForQuad(quad)) ;
continue;
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/util/ModelUtils.java
b/jena-arq/src/main/java/org/apache/jena/sparql/util/ModelUtils.java
index 48c698e3a6..adee7d810e 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/util/ModelUtils.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/ModelUtils.java
@@ -18,22 +18,22 @@
package org.apache.jena.sparql.util;
-import java.util.Iterator ;
-
-import org.apache.jena.atlas.iterator.Iter ;
-import org.apache.jena.graph.Node ;
-import org.apache.jena.graph.Triple ;
-import org.apache.jena.query.QueryException ;
-import org.apache.jena.rdf.model.Model ;
-import org.apache.jena.rdf.model.RDFNode ;
-import org.apache.jena.rdf.model.Statement ;
-import org.apache.jena.rdf.model.StmtIterator ;
-import org.apache.jena.rdf.model.impl.LiteralImpl ;
-import org.apache.jena.rdf.model.impl.ResourceImpl ;
-import org.apache.jena.rdf.model.impl.StmtIteratorImpl ;
-import org.apache.jena.sparql.ARQInternalErrorException ;
+import java.util.Iterator;
+
+import org.apache.jena.atlas.iterator.Iter;
+import org.apache.jena.graph.Node;
+import org.apache.jena.graph.Triple;
+import org.apache.jena.query.QueryException;
+import org.apache.jena.rdf.model.Model;
+import org.apache.jena.rdf.model.RDFNode;
+import org.apache.jena.rdf.model.Statement;
+import org.apache.jena.rdf.model.StmtIterator;
+import org.apache.jena.rdf.model.impl.LiteralImpl;
+import org.apache.jena.rdf.model.impl.ResourceImpl;
+import org.apache.jena.rdf.model.impl.StmtIteratorImpl;
+import org.apache.jena.sparql.ARQInternalErrorException;
import org.apache.jena.util.ModelCollector;
-import org.apache.jena.util.iterator.ClosableIterator ;
+import org.apache.jena.util.iterator.ClosableIterator;
public class ModelUtils
{
@@ -46,22 +46,22 @@ public class ModelUtils
public static RDFNode convertGraphNodeToRDFNode(Node node, Model model) {
if ( node.isVariable() )
- throw new QueryException("Variable: "+node) ;
+ throw new QueryException("Variable: "+node);
// Best way.
if ( model != null )
- return model.asRDFNode(node) ;
+ return model.asRDFNode(node);
if ( node.isLiteral() )
- return new LiteralImpl(node, null) ;
+ return new LiteralImpl(node, null);
if ( node.isURI() || node.isBlank() )
- return new ResourceImpl(node, null) ;
+ return new ResourceImpl(node, null);
if ( node.isNodeTriple() )
- return new ResourceImpl(node, null) ;
+ return new ResourceImpl(node, null);
- throw new ARQInternalErrorException("Unknown node type for node:
"+node) ;
+ throw new ARQInternalErrorException("Unknown node type for node:
"+node);
}
/** Convert a {@link Node} (graph SPI) to an RDFNode (model API)
@@ -73,18 +73,17 @@ public class ModelUtils
return convertGraphNodeToRDFNode(node, null);
}
- public static Statement tripleToStatement(Model model, Triple t)
- {
+ public static Statement tripleToStatement(Model model, Triple t) {
if ( model == null )
- throw new ARQInternalErrorException("Attempt to create statement
with null model") ;
+ throw new ARQInternalErrorException("Attempt to create statement
with null model");
- Node sNode = t.getSubject() ;
- Node pNode = t.getPredicate() ;
- Node oNode = t.getObject() ;
+ Node sNode = t.getSubject();
+ Node pNode = t.getPredicate();
+ Node oNode = t.getObject();
if (!isValidAsStatement(sNode, pNode, oNode)) return null;
- return model.asStatement(t) ;
+ return model.asStatement(t);
}
/**
@@ -97,19 +96,12 @@ public class ModelUtils
* @param p Predicate
* @param o Object
* @return True if a valid Statement can be formed
+ *
+ * @deprecated Use {@link NodeUtils#isValidAsRDF(Node, Node, Node)}.
*/
- public static boolean isValidAsStatement(Node s, Node p, Node o)
- {
- if ( s.isLiteral() || s.isVariable() )
- return false ;
-
- if ( ! p.isURI() ) // Not variable, literal or blank.
- return false ;
-
- if ( o.isVariable() )
- return false ;
-
- return true;
+ @Deprecated
+ public static boolean isValidAsStatement(Node s, Node p, Node o) {
+ return NodeUtils.isValidAsRDF(s, p, o);
}
public static StmtIterator triplesToStatements(final Iterator<Triple> it,
final Model refModel) {
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/util/NodeUtils.java
b/jena-arq/src/main/java/org/apache/jena/sparql/util/NodeUtils.java
index d1d50056c2..d8c791e174 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/util/NodeUtils.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/NodeUtils.java
@@ -25,7 +25,11 @@ import org.apache.jena.datatypes.RDFDatatype ;
import org.apache.jena.datatypes.xsd.XSDDatatype ;
import org.apache.jena.graph.Node ;
import org.apache.jena.graph.NodeFactory ;
+import org.apache.jena.graph.Triple;
import org.apache.jena.rdf.model.impl.Util;
+import org.apache.jena.riot.system.StreamRDF;
+import org.apache.jena.riot.system.StreamRDFWrapper;
+import org.apache.jena.sparql.core.Quad;
import org.apache.jena.sparql.expr.ExprEvalException ;
import org.apache.jena.sparql.expr.NodeValue ;
import org.apache.jena.sparql.expr.nodevalue.NodeFunctions ;
@@ -184,4 +188,66 @@ public class NodeUtils
*/
public static boolean isLangString(Node n) { return Util.isLangString(n) ;
}
+ /**
+ * Determines whether a triple (as s/p/o) is valid as a RDF statement.
+ * <p>
+ * This function reflects the fact that the {@link Triple} API is flexible
in
+ * allowing any Node type in any position (including non-RDF node types
like
+ * Variable) and as such not all Triples can be safely converted into
Statements
+ * </p>
+ * @param s Subject
+ * @param p Predicate
+ * @param o Object
+ * @return True if a valid as a statement
+ */
+ public static boolean isValidAsRDF(Node s, Node p, Node o) {
+ if ( s == null || ( ! s.isBlank() && ! s.isURI() ) )
+ return false;
+ if ( p == null || ( ! p.isURI() ) )
+ return false;
+ if ( o == null || ( ! o.isBlank() && ! o.isURI() && ! o.isLiteral() &&
!o.isNodeTriple() ) )
+ return false;
+ return true;
+ }
+
+ /**
+ * Determines whether a quad (as g/s/p/o) is valid as a RDF statement.
+ * <p>
+ * This function reflects the fact that the {@link Triple} API is flexible
in
+ * allowing any Node type in any position (including non-RDF node types
like
+ * Variable) and as such not all Triples can be safely converted into
Statements
+ * </p>
+ * @param s Subject
+ * @param p Predicate
+ * @param o Object
+ * @return True if a valid as a statement
+ */
+ public static boolean isValidAsRDF(Node g, Node s, Node p, Node o) {
+ if ( g == null || ( ! g.isURI() && ! g.isBlank() ) )
+ return false;
+ return isValidAsRDF(s, p, o);
+ }
+
+ /** Filter out triples and quads that are "generalized" RDF */
+ public static StreamRDF removeGeneralizedRDF(StreamRDF data) {
+ return new StreamRDFWrapper(data) {
+ @Override
+ public void quad(Quad quad) {
+ if ( ! isValidAsRDF(quad.getGraph(), quad.getSubject(),
quad.getPredicate(), quad.getObject()) ) {
+ // Reject
+ return;
+ }
+ super.quad(quad);
+ }
+
+ @Override
+ public void triple(Triple triple) {
+ if ( ! isValidAsRDF(triple.getSubject(),
triple.getPredicate(), triple.getObject()) ) {
+ // Reject
+ return;
+ }
+ super.triple(triple);
+ }
+ };
+ }
}
diff --git a/jena-arq/src/test/java/org/apache/jena/arq/ARQTestSuite.java
b/jena-arq/src/test/java/org/apache/jena/arq/ARQTestSuite.java
index 12534c53d1..ef199eed01 100644
--- a/jena-arq/src/test/java/org/apache/jena/arq/ARQTestSuite.java
+++ b/jena-arq/src/test/java/org/apache/jena/arq/ARQTestSuite.java
@@ -18,6 +18,11 @@
package org.apache.jena.arq;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
import org.apache.jena.atlas.TC_Atlas_ARQ;
import org.apache.jena.atlas.legacy.BaseTest2;
import org.apache.jena.external.Scripts_LangSuiteCG;
@@ -34,10 +39,7 @@ import org.apache.jena.sparql.expr.NodeValue;
import org.apache.jena.sys.JenaSystem;
import org.apache.jena.system.TS_System;
import org.apache.jena.system.buffering.TS_Buffering;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
+import org.apache.jena.util.TS_UtilsARQ;
/**
* All the ARQ tests
@@ -47,6 +49,8 @@ import org.junit.runners.Suite;
@Suite.SuiteClasses( {
TC_Atlas_ARQ.class,
+ TS_UtilsARQ.class,
+
TC_Riot.class,
TS_System.class,
diff --git a/jena-arq/src/main/java/org/apache/jena/rdfs/SetupRDFS.java
b/jena-arq/src/test/java/org/apache/jena/util/TS_UtilsARQ.java
similarity index 55%
copy from jena-arq/src/main/java/org/apache/jena/rdfs/SetupRDFS.java
copy to jena-arq/src/test/java/org/apache/jena/util/TS_UtilsARQ.java
index 84cc71cc7a..a813e7919c 100644
--- a/jena-arq/src/main/java/org/apache/jena/rdfs/SetupRDFS.java
+++ b/jena-arq/src/test/java/org/apache/jena/util/TS_UtilsARQ.java
@@ -16,28 +16,14 @@
* limitations under the License.
*/
-package org.apache.jena.rdfs;
-import org.apache.jena.graph.Graph;
-import org.apache.jena.graph.Node;
-import org.apache.jena.rdfs.setup.BaseSetupRDFS;
+package org.apache.jena.util;
-/** RDFS setup in Node space */
-public class SetupRDFS extends BaseSetupRDFS<Node> {
+import org.junit.runner.RunWith ;
+import org.junit.runners.Suite ;
- /**
- * {@code incDerivedDataRDFS} causes the engine to look for RDFS
relationships in the data
- * as if TBox (rules) and ABox (ground data) are one unit.
- * <p>
- * Set true if abox == tbox.
- * <p>
- * Can choose false or true if abox != tbox.
- */
- public SetupRDFS(Graph vocab) {
- super(vocab);
- }
+@RunWith(Suite.class)
[email protected]( {
+ TestNodeUtils.class
+})
- @Override
- protected Node fromNode(Node node) {
- return node;
- }
-}
+public class TS_UtilsARQ {}
diff --git a/jena-arq/src/test/java/org/apache/jena/util/TestNodeUtils.java
b/jena-arq/src/test/java/org/apache/jena/util/TestNodeUtils.java
new file mode 100644
index 0000000000..828637949d
--- /dev/null
+++ b/jena-arq/src/test/java/org/apache/jena/util/TestNodeUtils.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.util;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+import org.apache.jena.graph.Node;
+import org.apache.jena.graph.Triple;
+import org.apache.jena.sparql.core.Quad;
+import org.apache.jena.sparql.sse.SSE;
+import org.apache.jena.sparql.util.NodeUtils;
+
+public class TestNodeUtils {
+
+ private static final Node g = SSE.parseNode(":g");
+ private static final Node s = SSE.parseNode(":s");
+ private static final Node p = SSE.parseNode(":p");
+ private static final Node o = SSE.parseNode(":o");
+
+ @Test public void valid_triple_01() { testValidityTriple(true, "(:s :p
:o)"); }
+ @Test public void valid_triple_02() { testValidityTriple(true,
Triple.create(s, p, o)); }
+ @Test public void valid_triple_03() { testValidityTriple(true, "(:s :p
123)"); }
+ @Test public void valid_triple_04() { testValidityTriple(true, "(:s :p
_:b)"); }
+ @Test public void valid_triple_05() { testValidityTriple(true, "(_:b :p
:o)"); }
+
+ // RDF 1.2
+ //@Test public void valid_triple_06() { testValidityTriple(true, "(:s :p
<<( :x :y :x)>>)"); }
+
+
+ @Test public void invalid_triple_01() { testValidityTriple(false,
"('literal' :p :o)"); }
+ @Test public void invalid_triple_02() { testValidityTriple(false, "(:s
'literal' :o)"); }
+ @Test public void invalid_triple_03() { testValidityTriple(false, "(:s :p
?var)"); }
+ @Test public void invalid_triple_04() { testValidityTriple(false, "(:s
?var :o)"); }
+ @Test public void invalid_triple_05() { testValidityTriple(false, "(?var
:p :o)"); }
+
+ // _ is Node.ANY for triples.
+
+ @Test public void invalid_triple_10() { testValidityTriple(false, "(_ :p
:o)"); }
+ @Test public void invalid_triple_11() { testValidityTriple(false, "(:s _
:o)"); }
+ @Test public void invalid_triple_12() { testValidityTriple(false, "(:s :p
_)"); }
+
+ private void testValidityTriple(boolean expected, String triple) {
+ testValidityTriple(expected, SSE.parseTriple(triple));
+ }
+
+ private void testValidityTriple(boolean expected, Triple triple) {
+ Node s = triple.getSubject(), p = triple.getPredicate(), o =
triple.getObject();
+ assertEquals(expected, NodeUtils.isValidAsRDF(s, p, o));
+ }
+
+ @Test public void valid_quad_01() { testValidityQuad(true, "(:g :s :p
:o)"); }
+ @Test public void valid_quad_02() { testValidityQuad(true, Quad.create(g,
s, p, o)); }
+
+ @Test public void valid_quad_03() { testValidityQuad(true, "(:g :s :p
_:b)"); }
+ @Test public void valid_quad_04() { testValidityQuad(true, "(:g _:b :p
:o)"); }
+ @Test public void valid_quad_05() { testValidityQuad(true, "(_:b :s :p
:o)"); }
+ @Test public void valid_quad_06() { testValidityQuad(true, "(:g :s :p
'literal')"); }
+
+ // _ in the graph position is null/default graph
+ @Test public void valid_quad_09() { testValidityQuad(true, "(_ :s :p
:o)"); }
+
+ // RDF 1.2
+ //@Test public void valid_quad_06() { testValidityQuad(true, "(:s :p <<(
:x :y :x)>>)"); }
+
+ @Test public void invalid_quad_01() { testValidityQuad(false, "(:g :s
'literal' :o)"); }
+ @Test public void invalid_quad_02() { testValidityQuad(false, "(:g
'literal' :p :o)"); }
+ @Test public void invalid_quad_03() { testValidityQuad(false, "('literal'
:s :p :o)"); }
+
+ @Test public void invalid_quad_04() { testValidityQuad(false, "(:g :s :p
?var)"); }
+ @Test public void invalid_quad_05() { testValidityQuad(false, "(:g :s ?var
:o)"); }
+ @Test public void invalid_quad_06() { testValidityQuad(false, "(:g ?var :p
:o)"); }
+ @Test public void invalid_quad_07() { testValidityQuad(false, "(?var :s :p
:o)"); }
+
+ @Test public void invalid_quad_10() { testValidityQuad(false, "(:g _ :p
:o)"); }
+ @Test public void invalid_quad_11() { testValidityQuad(false, "(:g :s _
:o)"); }
+ @Test public void invalid_quad_12() { testValidityQuad(false, "(:g :s :p
_)"); }
+
+ private void testValidityQuad(boolean expected, String quad) {
+ testValidityQuad(expected, SSE.parseQuad(quad));
+ }
+
+ private void testValidityQuad(boolean expected, Quad quad) {
+ Node g = quad.getGraph(), s = quad.getSubject(), p =
quad.getPredicate(), o = quad.getObject();
+ assertEquals(expected, NodeUtils.isValidAsRDF(g, s, p, o));
+ }
+
+
+}
diff --git a/jena-cmds/src/main/java/riotcmd/CmdLangParse.java
b/jena-cmds/src/main/java/riotcmd/CmdLangParse.java
index 429e69c566..2d26ac9ad1 100644
--- a/jena-cmds/src/main/java/riotcmd/CmdLangParse.java
+++ b/jena-cmds/src/main/java/riotcmd/CmdLangParse.java
@@ -61,7 +61,7 @@ public abstract class CmdLangParse extends CmdGeneral {
protected ModTime modTime = new ModTime();
protected ModLangParse modLangParse = new ModLangParse();
protected ModLangOutput modLangOutput = new ModLangOutput();
- protected SetupRDFS setup = null;
+ protected SetupRDFS setupRDFS = null;
protected ModContext modContext = new ModContext();
protected ArgDecl argStrict = new ArgDecl(ArgDecl.NoValue, "strict");
@@ -181,7 +181,7 @@ public abstract class CmdLangParse extends CmdGeneral {
protected void exec$() {
if ( modLangParse.getRDFSVocab() != null )
- setup =
RDFSFactory.setupRDFS(modLangParse.getRDFSVocab().getGraph());
+ setupRDFS =
RDFSFactory.setupRDFS(modLangParse.getRDFSVocab().getGraph());
if ( modLangOutput.compressedOutput() ) {
try {
@@ -374,8 +374,13 @@ public abstract class CmdLangParse extends CmdGeneral {
// Build parser output additions.
StreamRDF s = parserOutputStream;
- if ( setup != null )
- s = RDFSFactory.streamRDFS(s, setup);
+ if ( setupRDFS != null ) {
+ // Remove literals as subjects
+ s = RDFSFactory.removeGeneralizedRDF(s);
+ // Generate RDFS (this feeds into the stream created above).
+ s = RDFSFactory.streamRDFS(s, setupRDFS);
+ // Parser sends data to RDFS, which goes to the filter, then to
parserOutputStream
+ }
// If added here, count is quads and triples seen in the input.
if ( modLangParse.mergeQuads() )
s = new QuadsToTriples(s);