public class ShaclSail extends NotifyingSailWrapper
Sail
implementation that adds support for the Shapes Constraint Language (SHACL).
The ShaclSail looks for SHACL shape data in a special named graph RDF4J.SHACL_SHAPE_GRAPH
.
import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.vocabulary.RDF4J; import org.eclipse.rdf4j.repository.RepositoryException; import org.eclipse.rdf4j.repository.sail.SailRepository; import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection; import org.eclipse.rdf4j.rio.RDFFormat; import org.eclipse.rdf4j.rio.Rio; import org.eclipse.rdf4j.sail.memory.MemoryStore; import org.eclipse.rdf4j.sail.shacl.ShaclSail; import org.eclipse.rdf4j.sail.shacl.ShaclSailValidationException; import org.eclipse.rdf4j.sail.shacl.results.ValidationReport; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.StringReader; public class ShaclSampleCode { public static void main(String[] args) throws IOException { ShaclSail shaclSail = new ShaclSail(new MemoryStore()); // Logger root = (Logger) LoggerFactory.getLogger(ShaclSail.class.getName()); // root.setLevel(Level.INFO); // shaclSail.setLogValidationPlans(true); // shaclSail.setGlobalLogValidationExecution(true); // shaclSail.setLogValidationViolations(true); SailRepository sailRepository = new SailRepository(shaclSail); sailRepository.init(); try (SailRepositoryConnection connection = sailRepository.getConnection()) { connection.begin(); StringReader shaclRules = new StringReader(String.join("\n", "", "@prefix ex: <http://example.com/ns#> .", "@prefix sh: <http://www.w3.org/ns/shacl#> .", "@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .", "@prefix foaf: <http://xmlns.com/foaf/0.1/>.", "ex:PersonShape", " a sh:NodeShape ;", " sh:targetClass foaf:Person ;", " sh:property ex:PersonShapeProperty .", "ex:PersonShapeProperty ", " sh:path foaf:age ;", " sh:datatype xsd:int ;", " sh:maxCount 1 ;", " sh:minCount 1 .")); connection.add(shaclRules, "", RDFFormat.TURTLE, RDF4J.SHACL_SHAPE_GRAPH); connection.commit(); connection.begin(); StringReader invalidSampleData = new StringReader(String.join("\n", "", "@prefix ex: <http://example.com/ns#> .", "@prefix foaf: <http://xmlns.com/foaf/0.1/>.", "@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .", "ex:peter a foaf:Person ;", " foaf:age 20, \"30\"^^xsd:int ." )); connection.add(invalidSampleData, "", RDFFormat.TURTLE); try { connection.commit(); } catch (RepositoryException exception) { Throwable cause = exception.getCause(); if (cause instanceof ShaclSailValidationException) { ValidationReport validationReport = ((ShaclSailValidationException) cause).getValidationReport(); Model validationReportModel = ((ShaclSailValidationException) cause).validationReportAsModel(); // use validationReport or validationReportModel to understand validation violations Rio.write(validationReportModel, System.out, RDFFormat.TURTLE); } throw exception; } } } }
Constructor and Description |
---|
ShaclSail() |
ShaclSail(NotifyingSail baseSail) |
Modifier and Type | Method and Description |
---|---|
void |
disableValidation()
Disable the SHACL validation on commit()
|
void |
enableValidation()
Enabled the SHACL validation on commit()
|
NotifyingSailConnection |
getConnection()
Opens a connection on the Sail which can be used to query and update data.
|
static List<IRI> |
getSupportedShaclPredicates()
Lists the predicates that have been implemented in the ShaclSail.
|
void |
initialize()
Initializes the Sail.
|
boolean |
isCacheSelectNodes()
Check if selected nodes caches is enabled.
|
boolean |
isGlobalLogValidationExecution()
Check if logging of every execution steps is enabled.
|
boolean |
isIgnoreNoShapesLoadedException() |
boolean |
isLogValidationPlans()
Check if logging of validation plans is enabled.
|
boolean |
isLogValidationViolations()
Check if logging a list of violations and the triples that caused the violations is enabled.
|
boolean |
isParallelValidation()
Check if SHACL validation is run in parellel.
|
boolean |
isRdfsSubClassReasoning() |
boolean |
isUndefinedTargetValidatesAllSubjects()
Check if
NodeShape s without a defined target are considered wildcards. |
boolean |
isValidationEnabled()
Check if SHACL validation on commit() is enabled.
|
void |
setCacheSelectNodes(boolean cacheSelectNodes)
The ShaclSail retries a lot of its relevant data through running SPARQL Select queries against the underlying
sail and against the changes in the transaction.
|
void |
setGlobalLogValidationExecution(boolean loggingEnabled)
Log (INFO) every execution step of the SHACL validation.
|
void |
setIgnoreNoShapesLoadedException(boolean ignoreNoShapesLoadedException)
Check if shapes have been loaded into the shapes graph before other data is added
|
void |
setLogValidationPlans(boolean logValidationPlans)
Log (INFO) the executed validation plans as GraphViz DOT Recommended to disable parallel validation with
setParallelValidation(false)
|
void |
setLogValidationViolations(boolean logValidationViolations)
Log (INFO) a list of violations and the triples that caused the violations (BETA).
|
void |
setParallelValidation(boolean parallelValidation)
EXPERIMENTAL! Run SHACL validation in parallel.
|
void |
setRdfsSubClassReasoning(boolean rdfsSubClassReasoning) |
void |
setUndefinedTargetValidatesAllSubjects(boolean undefinedTargetValidatesAllSubjects)
If no target is defined for a NodeShape, that NodeShape will be ignored.
|
void |
shutDown()
Shuts down the Sail, giving it the opportunity to synchronize any stale data.
|
addSailChangedListener, getBaseSail, removeSailChangedListener, setBaseSail
getDataDir, getDefaultIsolationLevel, getSupportedIsolationLevels, getValueFactory, isWritable, setDataDir, setFederatedServiceResolver, verifyBaseSailSet
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
getDataDir, getDefaultIsolationLevel, getSupportedIsolationLevels, getValueFactory, init, isWritable, setDataDir
public ShaclSail(NotifyingSail baseSail)
public ShaclSail()
public static List<IRI> getSupportedShaclPredicates()
public void initialize() throws SailException
Sail
initialize
in interface Sail
initialize
in class SailWrapper
SailException
- If the Sail could not be initialized.public void shutDown() throws SailException
Sail
shutDown
in interface Sail
shutDown
in class SailWrapper
SailException
- If the Sail object encountered an error or unexpected situation internally.public NotifyingSailConnection getConnection() throws SailException
Sail
getConnection
in interface NotifyingSail
getConnection
in interface Sail
getConnection
in class NotifyingSailWrapper
SailException
- If no transaction could be started, for example because the Sail is not writable.public void disableValidation()
public void enableValidation()
public boolean isValidationEnabled()
true
if validation is enabled, false
otherwise.public boolean isLogValidationPlans()
true
if validation plan logging is enabled, false
otherwise.public boolean isIgnoreNoShapesLoadedException()
public void setIgnoreNoShapesLoadedException(boolean ignoreNoShapesLoadedException)
ignoreNoShapesLoadedException
- public void setLogValidationPlans(boolean logValidationPlans)
logValidationPlans
- public void setGlobalLogValidationExecution(boolean loggingEnabled)
loggingEnabled
- public boolean isGlobalLogValidationExecution()
true
if enabled, false
otherwise.setGlobalLogValidationExecution(boolean)
public boolean isLogValidationViolations()
setParallelValidation(boolean)
setLogValidationViolations(boolean)
public void setLogValidationViolations(boolean logValidationViolations)
logValidationViolations
- public void setUndefinedTargetValidatesAllSubjects(boolean undefinedTargetValidatesAllSubjects)
undefinedTargetValidatesAllSubjects
- default falsepublic boolean isUndefinedTargetValidatesAllSubjects()
NodeShape
s without a defined target are considered wildcards.true
if enabled, false
otherwisesetUndefinedTargetValidatesAllSubjects(boolean)
public boolean isParallelValidation()
true
if enabled, false
otherwise.public void setParallelValidation(boolean parallelValidation)
May cause deadlock, especially when using NativeStore.
parallelValidation
- default falsepublic boolean isCacheSelectNodes()
true
if enabled, false
otherwise.setCacheSelectNodes(boolean)
public void setCacheSelectNodes(boolean cacheSelectNodes)
cacheSelectNodes
- default truepublic boolean isRdfsSubClassReasoning()
public void setRdfsSubClassReasoning(boolean rdfsSubClassReasoning)
Copyright © 2015-2019 Eclipse Foundation. All Rights Reserved.