Skip to content

Commit aac27a7

Browse files
committed
Quads Loader:
- Use Stream instead of Collection - Changed Graph versioning ontology
1 parent 80b6d60 commit aac27a7

File tree

2 files changed

+59
-67
lines changed

2 files changed

+59
-67
lines changed

graph-versioning.nt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
@prefix purl: <http://purl.org/dc/elements/1.1> .
55

66
<vers:Versioned-Named-Graph> <rdf:type> rdfs:Resource .
7-
<vers:Versioned-Named-Graph> <rdfs:comment> "A versioned graph name inside a given dataset" .
7+
<vers:Versioned-Named-Graph> <rdfs:comment> "A versioned graph name" .
88
<vers:Versioned-Named-Graph> <rdfs:label> "Versioned named graph"@en .
99
<vers:Versioned-Named-Graph> <rdfs:label> "Graphe nommé versionné"@fr .
1010

@@ -16,11 +16,11 @@
1616

1717
<vers:Versioned-Named-Graph> <vers:Version#is-version-of> vers:Named-Graph .
1818
<vers:Named-Graph> <rdf:type> rdfs:Class .
19-
<vers:Named-Graph> <rdfs:comment> "A graph name inside a given dataset" .
19+
<vers:Named-Graph> <rdfs:comment> "A graph name" .
2020
<vers:Named-Graph> <rdfs:label> "Named graph"@en .
2121
<vers:Named-Graph> <rdfs:label> "Graphe nommé"@fr .
2222

2323
<vers:Versioning> <rdf:type> <http://www.w3.org/2002/07/owl#Ontology> .
24-
<vers:Versioning> <purl:title> "The quad versioning vocabulary" .
24+
<vers:Versioning> <purl:title> "The graph versioning vocabulary" .
2525
<vers:Versioning> <purl:date> "2024-08-26" .
26-
<vers:Versioning> <purl:description> "This is the RDF schema for the quad versioning vocabulary terms, defined in the VCity ConVer-G work." .
26+
<vers:Versioning> <purl:description> "RDF schema of the graph versioning vocabulary terms" .

quads-loader/src/main/java/fr/vcity/converg/services/QuadImportService.java

Lines changed: 55 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
import fr.vcity.converg.repository.*;
66
import lombok.extern.slf4j.Slf4j;
77
import org.apache.commons.io.FilenameUtils;
8-
import org.apache.jena.query.Dataset;
9-
import org.apache.jena.rdf.model.*;
8+
import org.apache.jena.graph.Graph;
9+
import org.apache.jena.graph.Node;
10+
import org.apache.jena.graph.Triple;
1011
import org.apache.jena.riot.RDFLanguages;
1112
import org.apache.jena.riot.RDFParser;
1213
import org.apache.jena.riot.RiotException;
1314
import org.apache.jena.riot.system.ErrorHandlerFactory;
15+
import org.apache.jena.sparql.core.DatasetGraph;
1416
import org.springframework.stereotype.Service;
1517
import org.springframework.web.multipart.MultipartFile;
1618

@@ -23,9 +25,6 @@
2325
@Slf4j
2426
public class QuadImportService implements IQuadImportService {
2527

26-
public record Node(String value, String type) {
27-
}
28-
2928
public record TripleValueType(String sValue, String sType, String pValue, String pType, String oValue,
3029
String oType) {
3130
}
@@ -89,17 +88,17 @@ public Integer importModel(MultipartFile file) throws RiotException {
8988
log.info("Current file: {}", file.getOriginalFilename());
9089

9190
try (InputStream inputStream = file.getInputStream()) {
92-
Dataset dataset =
91+
DatasetGraph datasetGraph =
9392
RDFParser.create()
9493
.source(inputStream)
9594
.lang(RDFLanguages.nameToLang(FilenameUtils.getExtension(file.getOriginalFilename())))
9695
.errorHandler(ErrorHandlerFactory.errorHandlerStrict)
97-
.toDataset();
96+
.toDatasetGraph();
9897

9998
Long start = System.nanoTime();
10099

101-
extractAndInsertVersionedNamedGraph(file, dataset, version);
102-
extractAndInsertQuads(dataset, version);
100+
extractAndInsertVersionedNamedGraph(file, datasetGraph, version);
101+
extractAndInsertQuads(datasetGraph, version);
103102

104103
Long end = System.nanoTime();
105104
log.info("[Measure] (Import relational internal): {} ns for file: {};", end - start, file.getOriginalFilename());
@@ -139,23 +138,22 @@ public void importMetadata(MultipartFile file) throws RiotException {
139138
log.info("Current file: {}", file.getOriginalFilename());
140139

141140
try (InputStream inputStream = file.getInputStream()) {
142-
Dataset dataset =
141+
DatasetGraph datasetGraph =
143142
RDFParser.create()
144143
.source(inputStream)
145144
.lang(RDFLanguages.nameToLang(FilenameUtils.getExtension(file.getOriginalFilename())))
146145
.errorHandler(ErrorHandlerFactory.errorHandlerStrict)
147-
.toDataset();
146+
.toDatasetGraph();
148147

149148
Long start = System.nanoTime();
150149

151-
if (!dataset.getDefaultModel().listStatements().toList().isEmpty()) {
152-
importDefaultModel(dataset.getDefaultModel());
150+
if (!datasetGraph.getDefaultGraph().isEmpty()) {
151+
importDefaultModel(datasetGraph.getDefaultGraph());
153152
}
154153

155-
for (Iterator<Resource> i = dataset.listModelNames(); i.hasNext(); ) {
156-
Resource namedModel = i.next();
157-
Model model = dataset.getNamedModel(namedModel);
158-
importDefaultModel(model);
154+
for (Iterator<Node> i = datasetGraph.listGraphNodes(); i.hasNext(); ) {
155+
var graphNode = i.next();
156+
importDefaultModel(datasetGraph.getGraph(graphNode));
159157
}
160158

161159
Long end = System.nanoTime();
@@ -193,15 +191,14 @@ public void condenseModel() {
193191
/**
194192
* Import RDF default model statements
195193
*
196-
* @param defaultModel The default graph
194+
* @param graph The default graph
197195
*/
198-
private void importDefaultModel(Model defaultModel) {
199-
Set<RDFNode> nodeSet = new HashSet<>();
196+
private void importDefaultModel(Graph graph) {
197+
Set<Node> nodeSet = new HashSet<>();
200198
List<TripleValueType> tripleValueTypes = new ArrayList<>();
201199

202-
for (StmtIterator stmtIterator = defaultModel.listStatements(); stmtIterator.hasNext(); ) {
203-
tripleValueTypes.add(getTripleValueType(stmtIterator, nodeSet));
204-
}
200+
graph.stream()
201+
.forEach(triple -> tripleValueTypes.add(getTripleValueType(triple, nodeSet)));
205202

206203
if (!tripleValueTypes.isEmpty()) {
207204
metadataComponent.saveTriples(tripleValueTypes);
@@ -215,30 +212,25 @@ private void importDefaultModel(Model defaultModel) {
215212
/**
216213
* Extract and insert the quads
217214
*
218-
* @param dataset The dataset
219-
* @param version The version
215+
* @param datasetGraph The datasetGraph
216+
* @param version The version
220217
*/
221-
private void extractAndInsertQuads(Dataset dataset, Version version) {
222-
Set<RDFNode> nodeSet = new HashSet<>();
218+
private void extractAndInsertQuads(DatasetGraph datasetGraph, Version version) {
219+
Set<Node> nodeSet = new HashSet<>();
223220
List<QuadValueType> quadValueTypes = new ArrayList<>();
224221

225-
for (Iterator<Resource> i = dataset.listModelNames(); i.hasNext(); ) {
226-
Resource namedModel = i.next();
227-
Model model = dataset.getNamedModel(namedModel);
228-
log.info("Name Graph : {}", namedModel.getURI());
222+
datasetGraph.stream()
223+
.forEach(quad -> {
224+
QuadValueType quadValueType = new QuadValueType(getTripleValueType(quad.asTriple(), nodeSet), quad.getGraph().getURI(), version.getIndexVersion() - 1);
225+
quadValueTypes.add(quadValueType);
226+
});
229227

230-
for (StmtIterator stmtIterator = model.listStatements(); stmtIterator.hasNext(); ) {
231-
QuadValueType quadValueType = new QuadValueType(getTripleValueType(stmtIterator, nodeSet), namedModel.getURI(), version.getIndexVersion() - 1);
232-
quadValueTypes.add(quadValueType);
233-
}
234-
}
235-
236-
if (!dataset.getDefaultModel().listStatements().toList().isEmpty()) {
237-
for (StmtIterator stmtIterator = dataset.getDefaultModel().listStatements(); stmtIterator.hasNext(); ) {
238-
QuadValueType quadValueType = new QuadValueType(getTripleValueType(stmtIterator, nodeSet), defaultGraphURI.getName(), version.getIndexVersion() - 1);
239-
quadValueTypes.add(quadValueType);
240-
}
241-
}
228+
datasetGraph.getDefaultGraph()
229+
.stream()
230+
.forEach(triple -> {
231+
QuadValueType quadValueType = new QuadValueType(getTripleValueType(triple, nodeSet), defaultGraphURI.getName(), version.getIndexVersion() - 1);
232+
quadValueTypes.add(quadValueType);
233+
});
242234

243235
if (!quadValueTypes.isEmpty()) {
244236
versionedQuadComponent.saveQuads(quadValueTypes);
@@ -248,18 +240,19 @@ private void extractAndInsertQuads(Dataset dataset, Version version) {
248240
/**
249241
* Extract and insert the versioned named graph
250242
*
251-
* @param file The input file
252-
* @param dataset The dataset
253-
* @param version The version
243+
* @param file The input file
244+
* @param datasetGraph The datasetGraph
245+
* @param version The version
254246
*/
255-
private void extractAndInsertVersionedNamedGraph(MultipartFile file, Dataset dataset, Version version) {
247+
private void extractAndInsertVersionedNamedGraph(MultipartFile file, DatasetGraph datasetGraph, Version version) {
256248
List<String> namedGraphs = new ArrayList<>();
257-
for (Iterator<Resource> i = dataset.listModelNames(); i.hasNext(); ) {
258-
Resource namedModel = i.next();
249+
250+
for (Iterator<Node> i = datasetGraph.listGraphNodes(); i.hasNext(); ) {
251+
var namedModel = i.next();
259252
namedGraphs.add(namedModel.getURI());
260253
}
261254

262-
if (!dataset.getDefaultModel().listStatements().toList().isEmpty()) {
255+
if (!datasetGraph.getDefaultGraph().isEmpty()) {
263256
namedGraphs.add(defaultGraphURI.getName());
264257
}
265258

@@ -271,28 +264,27 @@ private void extractAndInsertVersionedNamedGraph(MultipartFile file, Dataset dat
271264
/**
272265
* Get the triple value type
273266
*
274-
* @param stmtIterator The statement iterator
275-
* @param nodeSet The node set
267+
* @param triple The triple
268+
* @param nodeSet The node set
276269
* @return The triple value type
277270
*/
278-
private static TripleValueType getTripleValueType(StmtIterator stmtIterator, Set<RDFNode> nodeSet) {
279-
Statement statement = stmtIterator.next();
280-
RDFNode subject = statement.getSubject();
281-
RDFNode predicate = statement.getPredicate();
282-
RDFNode object = statement.getObject();
271+
private static TripleValueType getTripleValueType(Triple triple, Set<Node> nodeSet) {
272+
var subject = triple.getSubject();
273+
var predicate = triple.getPredicate();
274+
var object = triple.getObject();
283275

284276
nodeSet.add(subject);
285277
nodeSet.add(predicate);
286278
nodeSet.add(object);
287279

288-
String sValue = subject.isLiteral() ? subject.asLiteral().getString() : subject.toString();
289-
String sType = subject.isLiteral() ? subject.asLiteral().getDatatype().getURI() : null;
280+
String sValue = subject.isLiteral() ? subject.getLiteral().getValue().toString() : subject.toString();
281+
String sType = subject.isLiteral() ? subject.getLiteral().getDatatype().getURI() : null;
290282

291-
String pValue = predicate.isLiteral() ? predicate.asLiteral().getString() : predicate.toString();
292-
String pType = predicate.isLiteral() ? predicate.asLiteral().getDatatype().getURI() : null;
283+
String pValue = predicate.isLiteral() ? predicate.getLiteral().getValue().toString() : predicate.toString();
284+
String pType = predicate.isLiteral() ? predicate.getLiteral().getDatatype().getURI() : null;
293285

294-
String oValue = object.isLiteral() ? object.asLiteral().getString() : object.toString();
295-
String oType = object.isLiteral() ? object.asLiteral().getDatatype().getURI() : null;
286+
String oValue = object.isLiteral() ? object.getLiteral().getValue().toString() : object.toString();
287+
String oType = object.isLiteral() ? object.getLiteral().getDatatype().getURI() : null;
296288
return new TripleValueType(sValue, sType, pValue, pType, oValue, oType);
297289
}
298290
}

0 commit comments

Comments
 (0)