Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,7 @@ hs_err_*

# Fuseki file area
run/

# Benchmark JSON results
jena-benchmarks/jena-benchmarks-jmh/*.json

19 changes: 12 additions & 7 deletions jena-arq/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
</dependency>

<dependency>
<groupId>org.slf4j</groupId>
Expand All @@ -71,12 +71,12 @@
<artifactId>jakarta.json</artifactId>
</dependency>
<!-- End Titanium JSON-LD 1.1 -->

<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
</dependency>

<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
Expand Down Expand Up @@ -124,6 +124,11 @@
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-math4-legacy</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
Expand All @@ -139,7 +144,7 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
Expand Down Expand Up @@ -172,11 +177,11 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<executions>
<execution>
<id>attach-sources-test</id>
<id>attach-sources-test</id>
<goals>
<goal>test-jar-no-fork</goal>
<goal>test-jar-no-fork</goal>
</goals>
</execution>
</executions>
Expand Down
120 changes: 4 additions & 116 deletions jena-arq/src/main/java/org/apache/jena/rdfs/DatasetGraphRDFS.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,134 +18,22 @@

package org.apache.jena.rdfs;

import static org.apache.jena.atlas.iterator.Iter.iter;

import java.util.Iterator;

import org.apache.jena.atlas.iterator.Iter;
import org.apache.jena.graph.Graph;
import org.apache.jena.graph.Node;
import org.apache.jena.rdfs.engine.DatasetGraphWithGraphTransform;
import org.apache.jena.sparql.core.DatasetGraph;
import org.apache.jena.sparql.core.DatasetGraphWrapper;
import org.apache.jena.sparql.core.DatasetGraphWrapperView;
import org.apache.jena.sparql.core.Quad;
import org.apache.jena.sparql.util.Context;

public class DatasetGraphRDFS extends DatasetGraphWrapper implements DatasetGraphWrapperView {
public class DatasetGraphRDFS extends DatasetGraphWithGraphTransform implements DatasetGraphWrapperView {
// Do not unwrap for query execution.

private final SetupRDFS setup;

public DatasetGraphRDFS(DatasetGraph dsg, SetupRDFS setup) {
super(dsg);
super(dsg, g -> new GraphRDFS(g, setup));
this.setup = setup;
}

public DatasetGraphRDFS(DatasetGraph dsg, SetupRDFS setup, Context cxt) {
super(dsg, cxt);
super(dsg, cxt, g -> new GraphRDFS(g, setup));
this.setup = setup;
}

// Graph-centric access.
@Override
public Graph getDefaultGraph() {
Graph base = getG().getDefaultGraph();
return new GraphRDFS(base, setup);
}

@Override
public Graph getUnionGraph() {
Graph base = getG().getUnionGraph();
return new GraphRDFS(base, setup);
}

@Override
public Graph getGraph(Node graphNode) {
Graph base = getG().getGraph(graphNode);
if ( base == null )
return null;
return new GraphRDFS(base, setup);
}

@Override
public Iterator<Quad> find()
{ return find(Node.ANY, Node.ANY, Node.ANY, Node.ANY); }

// Quad-centric access
@Override
public Iterator<Quad> find(Quad quad) {
return find(quad.getGraph(), quad.getSubject(), quad.getPredicate(), quad.getObject());
}

@Override
public Iterator<Quad> find(Node g, Node s, Node p, Node o) {
Iterator<Quad> iter = findInf(g, s, p, o);
if ( iter == null )
return Iter.nullIterator();
return iter;
}

// private Iterator<Quad> findInf(Node g, Node s, Node p, Node o) {
// // Puts in the graph name for the quad base don g even if g is ANY or null.
// MatchRDFS<Node, Quad> infMatcher = new InfFindQuad(setup, g, getR());
// Stream<Quad> quads = infMatcher.match(s, p, o);
// Iterator<Quad> iter = quads.iterator();
// iter = Iter.onClose(iter, ()->quads.close());
// return iter;
// }

/**
* Find, graph by graph.
*/
private Iterator<Quad> findInf(Node g, Node s, Node p, Node o) {
if ( g != null && g.isConcrete() ) {
// Includes the union graph case.
return findOneGraphInf(g, s, p, o);
}
// Wildcard. Do each graph in-term.
// This ensures the graph node of the quad corresponds to where the inference came from.
Iter<Quad> iter1 = findOneGraphInf(Quad.defaultGraphIRI, s, p, o);
Iterator<Quad> iter2 = findAllNamedGraphInf(s, p, o);
return iter1.append(iter2);
}

// All named graphs, with inference. Quads refer to the name graph they were caused by.
private Iterator<Quad> findAllNamedGraphInf(Node s, Node p, Node o) {
return Iter.flatMap(listGraphNodes(), gn -> findOneGraphInf(gn, s, p, o));
}

// Single graph (inc. union graph). Quads refer to the name graph they were caused by.
private Iter<Quad> findOneGraphInf(Node g, Node s, Node p, Node o) {
if ( ! g.isConcrete() )
throw new IllegalStateException();
// f ( Quad.isUnionGraph(g) ) {}
// Specific named graph.
return iter(getGraph(g).find(s,p,o)).map(t->Quad.create(g, t));
}

@Override
public Iterator<Quad> findNG(Node g, Node s, Node p, Node o) {
if ( Quad.isDefaultGraph(g) )
throw new IllegalArgumentException("Default graph in findNG call");
if ( g == null )
g = Node.ANY;
if ( g == Node.ANY )
return findAllNamedGraphInf(s, p, o);
// Same as specific named graph - we return quads in the union graph.
// if ( Quad.isUnionGraph(g) ) {}
return findOneGraphInf(g, s, p, o);
}

@Override
public boolean contains(Quad quad)
{ return contains(quad.getGraph(), quad.getSubject(), quad.getPredicate(), quad.getObject()); }

@Override
public boolean contains(Node g, Node s, Node p, Node o) {
// Go through the inference machinery.
Iterator<Quad> iter = find(g, s, p, o);
try {
return iter.hasNext();
} finally { Iter.close(iter); }
}
}
59 changes: 3 additions & 56 deletions jena-arq/src/main/java/org/apache/jena/rdfs/GraphRDFS.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,73 +18,20 @@

package org.apache.jena.rdfs;

import java.util.stream.Stream;

import org.apache.jena.graph.Graph;
import org.apache.jena.graph.Node;
import org.apache.jena.graph.Triple;
import org.apache.jena.rdfs.engine.GraphMatch;
import org.apache.jena.rdfs.engine.InfFindTriple;
import org.apache.jena.rdfs.engine.MatchRDFS;
import org.apache.jena.rdfs.setup.ConfigRDFS;
import org.apache.jena.sparql.graph.GraphWrapper;
import org.apache.jena.util.iterator.ExtendedIterator;
import org.apache.jena.util.iterator.WrappedIterator;

/**
* RDFS graph over a base graph.
*/
public class GraphRDFS extends GraphWrapper {
private final MatchRDFS<Node, Triple> source;
public class GraphRDFS extends GraphMatch {
private final ConfigRDFS<Node> setup;

public GraphRDFS(Graph graph, ConfigRDFS<Node> setup) {
super(graph);
super(graph, new InfFindTriple(setup, graph));
this.setup = setup;
this.source = new InfFindTriple(setup, graph);
}

@Override
public ExtendedIterator<Triple> find(Triple m) {
return find(m.getSubject(), m.getPredicate(), m.getObject());
}

@Override
public ExtendedIterator<Triple> find(Node s, Node p, Node o) {
Stream<Triple> stream = source.match(s, p, o);
ExtendedIterator<Triple> iter = WrappedIterator.ofStream(stream);
return iter;
}

@Override
public Stream<Triple> stream(Node s, Node p, Node o) {
return source.match(s, p, o);
}

@Override
public boolean contains(Node s, Node p, Node o) {
// Must go via find()-like functionality.
ExtendedIterator<Triple> iter = find(s, p, o);
try {
return iter.hasNext();
} finally { iter.close(); }
}

@Override
public boolean contains(Triple t) {
return contains(t.getSubject(), t.getPredicate(), t.getObject());
}

@Override
public int size() {
// Report the size of the underlying graph.
// Even better, don't ask.
return super.size();
}

@Override
public boolean dependsOn(Graph other) {
if ( other == super.get() )
return true;
return super.dependsOn(other);
}
}
18 changes: 16 additions & 2 deletions jena-arq/src/main/java/org/apache/jena/rdfs/RDFSFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,12 @@

package org.apache.jena.rdfs;
import org.apache.jena.graph.Graph;
import org.apache.jena.graph.Node;
import org.apache.jena.query.Dataset;
import org.apache.jena.query.DatasetFactory;
import org.apache.jena.rdfs.engine.MapperX;
import org.apache.jena.rdfs.setup.BaseSetupRDFS;
import org.apache.jena.rdfs.setup.ConfigRDFS;
import org.apache.jena.riot.system.StreamRDF;
import org.apache.jena.sparql.core.DatasetGraph;
import org.apache.jena.sparql.util.NodeUtils;
Expand Down Expand Up @@ -56,20 +60,30 @@ public static DatasetGraph datasetRDFS(DatasetGraph data, SetupRDFS setup) {
/** Create an RDFS inference dataset. */
public static DatasetGraph datasetRDFS(DatasetGraph data, Graph vocab ) {
SetupRDFS setup = setupRDFS(vocab);
return new DatasetGraphRDFS(data, setup);
return datasetRDFS(data, setup);
}

/** Create an RDFS inference dataset. */
public static Dataset datasetRDFS(Dataset data, Graph vocab ) {
SetupRDFS setup = setupRDFS(vocab);
return DatasetFactory.wrap(new DatasetGraphRDFS(data.asDatasetGraph(), setup));
return DatasetFactory.wrap(datasetRDFS(data.asDatasetGraph(), setup));
}

/** Create an {@link SetupRDFS} */
public static SetupRDFS setupRDFS(Graph vocab) {
return new SetupRDFS(vocab);
}

/** Create a {@link ConfigRDFS} via a {@link MapperX}. */
public static <X> ConfigRDFS<X> setupRDFS(Graph vocab, MapperX<X, ?> mapper) {
return new BaseSetupRDFS<>(vocab) {
@Override
protected X fromNode(Node node) {
return mapper.fromNode(node);
}
};
}

/** Stream expand data based on a separate vocabulary */
public static StreamRDF streamRDFS(StreamRDF data, Graph vocab) {
SetupRDFS setup = new SetupRDFS(vocab);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
import org.apache.jena.assembler.exceptions.AssemblerException;
import org.apache.jena.graph.Graph;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.rdfs.DatasetGraphRDFS;
import org.apache.jena.rdfs.RDFSFactory;
import org.apache.jena.rdfs.SetupRDFS;
import org.apache.jena.riot.RDFDataMgr;
Expand All @@ -50,15 +49,14 @@ public Map<String, DatasetGraph> pool() {
/**
* <pre>
* &lt;#rdfsDS&gt; rdf:type ja:DatasetRDFS ;
* ja:rdfs "vocab.ttl";
* ja:rdfsSchema "vocab.ttl";
* ja:dataset &lt;#baseDS&gt; ;
* .
*
* &lt;#baseDS&gt; rdf:type ja:MemoryDataset ;
* ja:name "TIM database" # optional: this is need if the base database is accessed directly.
* ja:data "data1.trig";
* ## ja:data "data2.trig";
*
* .
* </pre>
*/
Expand All @@ -76,7 +74,7 @@ public DatasetGraph createDataset(Assembler a, Resource root) {

Graph schema = RDFDataMgr.loadGraph(schemaFile);
SetupRDFS setup = RDFSFactory.setupRDFS(schema);
DatasetGraph dsg = new DatasetGraphRDFS(base, setup);
DatasetGraph dsg = RDFSFactory.datasetRDFS(base, setup);
AssemblerUtils.mergeContext(root, dsg.getContext());
return dsg;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public Object open(Assembler a, Resource root, Mode mode) {
/**
* <pre>
* &lt;#rdfsGraph&gt; rdf:type ja:GraphRDFS ;
* ja:rdfs "vocab.ttl";
* ja:rdfsSchema "vocab.ttl";
* ja:graph &lt;#baseGraph&gt; ;
* .
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,10 +129,12 @@ final private void range(X s, X p, X o, Output<X> out) {
return;
}
Set<X> x = setup.getRange(p);
x.forEach(c -> {
derive(o, rdfType, c, out);
subClass(o, rdfType, c, out);
});
if (!mapper.isLiteral(o)) {
Copy link
Contributor Author

@Aklakan Aklakan Oct 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The question is how to minimize materialization in this check. One can check for whether a NodeId is an inlined value and return early. But not sure if from the NodeId alone it can be decided whether it's a literal or not.

x.forEach(c -> {
derive(o, rdfType, c, out);
subClass(o, rdfType, c, out);
});
}
}
}

Loading