aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2018-10-14 22:18:17 +0200
committerDavid Robillard <d@drobilla.net>2019-01-05 17:12:38 +0100
commit1460ce896e041a7b33382504a84d747f0f7bd65e (patch)
treeb5bb7b49b3bd0db98d18347d09ed037d76a0a6c9
parent0f943c203ae9653efabb8168b82d2e56898c5fac (diff)
downloadserd-1460ce896e041a7b33382504a84d747f0f7bd65e.tar.gz
serd-1460ce896e041a7b33382504a84d747f0f7bd65e.tar.bz2
serd-1460ce896e041a7b33382504a84d747f0f7bd65e.zip
Add validation test suite
-rw-r--r--schemas/dct.ttl340
-rw-r--r--schemas/owl.ttl615
-rw-r--r--schemas/rdf.ttl129
-rw-r--r--schemas/rdfs.ttl124
-rw-r--r--schemas/xsd.ttl353
-rw-r--r--tests/validate/bad-all-values-from.ttl18
-rw-r--r--tests/validate/bad-cardinality-high.ttl18
-rw-r--r--tests/validate/bad-cardinality-low.ttl16
-rw-r--r--tests/validate/bad-cardinality.ttl18
-rw-r--r--tests/validate/bad-datatype-property.ttl18
-rw-r--r--tests/validate/bad-domain.ttl19
-rw-r--r--tests/validate/bad-functional-property.ttl13
-rw-r--r--tests/validate/bad-inverse-functional-property.ttl15
-rw-r--r--tests/validate/bad-literal-pattern.ttl7
-rw-r--r--tests/validate/bad-literal-value-high-exclusive.ttl18
-rw-r--r--tests/validate/bad-literal-value-high-inclusive.ttl18
-rw-r--r--tests/validate/bad-literal-value-low-exclusive.ttl18
-rw-r--r--tests/validate/bad-literal-value-low-inclusive.ttl19
-rw-r--r--tests/validate/bad-object-property.ttl12
-rw-r--r--tests/validate/bad-pattern.ttl21
-rw-r--r--tests/validate/bad-plain-literal.ttl12
-rw-r--r--tests/validate/bad-range-instance-not-literal.ttl18
-rw-r--r--tests/validate/bad-range-instance.ttl21
-rw-r--r--tests/validate/bad-range-literal-not-instance.ttl15
-rw-r--r--tests/validate/bad-range-literal.ttl21
-rw-r--r--tests/validate/bad-some-values-from.ttl18
-rw-r--r--tests/validate/bad-string-literal-value-high.ttl19
-rw-r--r--tests/validate/bad-string-literal-value-low.ttl19
-rw-r--r--tests/validate/bad-unknown-datatype.ttl6
-rw-r--r--tests/validate/bad-unknown-property.ttl6
-rw-r--r--tests/validate/manifest.ttl165
-rw-r--r--wscript57
32 files changed, 2178 insertions, 8 deletions
diff --git a/schemas/dct.ttl b/schemas/dct.ttl
new file mode 100644
index 00000000..5cdd5047
--- /dev/null
+++ b/schemas/dct.ttl
@@ -0,0 +1,340 @@
+@prefix dcterms: <http://purl.org/dc/terms/> .
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+dcterms:
+ a owl:Ontology ;
+ dcterms:modified "2010-10-11" ;
+ dcterms:title "DCMI Metadata Terms"@en-us ;
+ rdfs:comment "This version of the DCMI Terms vocabulary has been heavily trimmed for LV2." .
+
+dcterms:Agent
+ a dcterms:AgentClass ,
+ rdfs:Class ;
+ dcterms:description "Examples of Agent include person, organization, and software agent."@en-us ;
+ rdfs:comment "A resource that acts or has the power to act."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "Agent"@en-us .
+
+dcterms:AgentClass
+ a rdfs:Class ;
+ dcterms:description "Examples of Agent Class include groups seen as classes, such as students, women, charities, lecturers."@en-us ;
+ rdfs:comment "A group of agents."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "Agent Class"@en-us ;
+ rdfs:subClassOf dcterms:AgentClass .
+
+dcterms:LicenseDocument
+ a rdfs:Class ;
+ rdfs:comment "A legal document giving official permission to do something with a Resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "License Document"@en-us ;
+ rdfs:subClassOf dcterms:RightsStatement .
+
+dcterms:LinguisticSystem
+ a rdfs:Class ;
+ dcterms:description "Examples include written, spoken, sign, and computer languages."@en-us ;
+ rdfs:comment "A system of signs, symbols, sounds, gestures, or rules used in communication."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "Linguistic System"@en-us .
+
+dcterms:MediaType
+ a rdfs:Class ;
+ rdfs:comment "A file format or physical medium."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "Media Type"@en-us ;
+ rdfs:subClassOf dcterms:MediaTypeOrExtent .
+
+dcterms:MediaTypeOrExtent
+ a rdfs:Class ;
+ rdfs:comment "A media type or extent."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "Media Type or Extent"@en-us .
+
+dcterms:RightsStatement
+ a rdfs:Class ;
+ rdfs:comment "A statement about the intellectual property rights (IPR) held in or over a Resource, a legal document giving official permission to do something with a resource, or a statement about access rights."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "Rights Statement"@en-us .
+
+dcterms:Standard
+ a rdfs:Class ;
+ rdfs:comment "A basis for comparison; a reference point against which other things can be evaluated."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "Standard"@en-us .
+
+dcterms:URI
+ a rdfs:Datatype ;
+ rdfs:comment "The set of identifiers constructed according to the generic syntax for Uniform Resource Identifiers as specified by the Internet Engineering Task Force."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "URI"@en-us ;
+ rdfs:seeAlso <http://www.ietf.org/rfc/rfc3986.txt> .
+
+dcterms:W3CDTF
+ a rdfs:Datatype ;
+ rdfs:comment "The set of dates and times constructed according to the W3C Date and Time Formats Specification."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "W3C-DTF"@en-us ;
+ rdfs:seeAlso <http://www.w3.org/TR/NOTE-datetime> .
+
+dcterms:abstract
+ a rdf:Property ;
+ rdfs:comment "A summary of the resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "Abstract"@en-us ;
+ rdfs:subPropertyOf dcterms:description .
+
+dcterms:alternative
+ a rdf:Property ;
+ dcterms:description "The distinction between titles and alternative titles is application-specific."@en-us ;
+ rdfs:comment "An alternative name for the resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "alternative title"@en-us ;
+ rdfs:range rdfs:Literal ;
+ rdfs:subPropertyOf dcterms:title .
+
+dcterms:available
+ a rdf:Property ;
+ rdfs:comment "Date (often a range) that the resource became or will become available."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "date available"@en-us ;
+ rdfs:range rdfs:Literal ;
+ rdfs:subPropertyOf dcterms:date .
+
+dcterms:conformsTo
+ a rdf:Property ;
+ rdfs:comment "An established standard to which the described resource conforms."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "conforms to"@en-us ;
+ rdfs:range dcterms:Standard ;
+ rdfs:subPropertyOf dcterms:relation .
+
+dcterms:contributor
+ a rdf:Property ;
+ dcterms:description "Examples of a Contributor include a person, an organization, or a service."@en-us ;
+ rdfs:comment "An entity responsible for making contributions to the resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "contributor"@en-us ;
+ rdfs:range dcterms:Agent .
+
+dcterms:created
+ a rdf:Property ;
+ rdfs:comment "Date of creation of the resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "date created"@en-us ;
+ rdfs:range rdfs:Literal ;
+ rdfs:subPropertyOf dcterms:date .
+
+dcterms:creator
+ a rdf:Property ;
+ dcterms:description "Examples of a Creator include a person, an organization, or a service."@en-us ;
+ rdfs:comment "An entity primarily responsible for making the resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "creator"@en-us ;
+ rdfs:range dcterms:Agent ;
+ rdfs:subPropertyOf dcterms:contributor ;
+ owl:equivalentProperty <http://xmlns.com/foaf/0.1/maker> .
+
+dcterms:date
+ a rdf:Property ;
+ dcterms:description "Date may be used to express temporal information at any level of granularity. Recommended best practice is to use an encoding scheme, such as the W3CDTF profile of ISO 8601 [W3CDTF]."@en-us ;
+ rdfs:comment "A point or period of time associated with an event in the lifecycle of the resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "date"@en-us ;
+ rdfs:range rdfs:Literal .
+
+dcterms:dateAccepted
+ a rdf:Property ;
+ dcterms:description "Examples of resources to which a Date Accepted may be relevant are a thesis (accepted by a university department) or an article (accepted by a journal)."@en-us ;
+ rdfs:comment "Date of acceptance of the resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "date accepted"@en-us ;
+ rdfs:range rdfs:Literal ;
+ rdfs:subPropertyOf dcterms:date .
+
+dcterms:dateCopyrighted
+ a rdf:Property ;
+ rdfs:comment "Date of copyright."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "date copyrighted"@en-us ;
+ rdfs:range rdfs:Literal ;
+ rdfs:subPropertyOf dcterms:date .
+
+dcterms:dateSubmitted
+ a rdf:Property ;
+ dcterms:description "Examples of resources to which a Date Submitted may be relevant are a thesis (submitted to a university department) or an article (submitted to a journal)."@en-us ;
+ rdfs:comment "Date of submission of the resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "date submitted"@en-us ;
+ rdfs:range rdfs:Literal ;
+ rdfs:subPropertyOf dcterms:date .
+
+dcterms:description
+ a rdf:Property ;
+ dcterms:description "Description may include but is not limited to: an abstract, a table of contents, a graphical representation, or a free-text account of the resource."@en-us ;
+ rdfs:comment "An account of the resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "description"@en-us .
+
+dcterms:format
+ a rdf:Property ;
+ dcterms:description "Examples of dimensions include size and duration. Recommended best practice is to use a controlled vocabulary such as the list of Internet Media Types [MIME]."@en-us ;
+ rdfs:comment "The file format, physical medium, or dimensions of the resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "format"@en-us ;
+ rdfs:range dcterms:MediaTypeOrExtent .
+
+dcterms:hasFormat
+ a rdf:Property ;
+ rdfs:comment "A related resource that is substantially the same as the pre-existing described resource, but in another format."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "has format"@en-us ;
+ rdfs:subPropertyOf dcterms:relation .
+
+dcterms:hasPart
+ a rdf:Property ;
+ rdfs:comment "A related resource that is included either physically or logically in the described resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "has part"@en-us ;
+ rdfs:subPropertyOf dcterms:relation .
+
+dcterms:hasVersion
+ a rdf:Property ;
+ rdfs:comment "A related resource that is a version, edition, or adaptation of the described resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "has version"@en-us ;
+ rdfs:subPropertyOf dcterms:relation .
+
+dcterms:isFormatOf
+ a rdf:Property ;
+ rdfs:comment "A related resource that is substantially the same as the described resource, but in another format."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "is format of"@en-us ;
+ rdfs:subPropertyOf dcterms:relation .
+
+dcterms:isPartOf
+ a rdf:Property ;
+ rdfs:comment "A related resource in which the described resource is physically or logically included."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "is part of"@en-us ;
+ rdfs:subPropertyOf dcterms:relation .
+
+dcterms:isReferencedBy
+ a rdf:Property ;
+ rdfs:comment "A related resource that references, cites, or otherwise points to the described resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "is referenced by"@en-us ;
+ rdfs:subPropertyOf dcterms:relation .
+
+dcterms:isReplacedBy
+ a rdf:Property ;
+ rdfs:comment "A related resource that supplants, displaces, or supersedes the described resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "is replaced by"@en-us ;
+ rdfs:subPropertyOf dcterms:relation .
+
+dcterms:isRequiredBy
+ a rdf:Property ;
+ rdfs:comment "A related resource that requires the described resource to support its function, delivery, or coherence."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "is required by"@en-us ;
+ rdfs:subPropertyOf dcterms:relation .
+
+dcterms:isVersionOf
+ a rdf:Property ;
+ dcterms:description "Changes in version imply substantive changes in content rather than differences in format."@en-us ;
+ rdfs:comment "A related resource of which the described resource is a version, edition, or adaptation."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "is version of"@en-us ;
+ rdfs:subPropertyOf dcterms:relation .
+
+dcterms:issued
+ a rdf:Property ;
+ rdfs:comment "Date of formal issuance (e.g., publication) of the resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "date issued"@en-us ;
+ rdfs:range rdfs:Literal ;
+ rdfs:subPropertyOf dcterms:date .
+
+dcterms:language
+ a rdf:Property ;
+ dcterms:description "Recommended best practice is to use a controlled vocabulary such as RFC 4646."@en-us ;
+ rdfs:comment "A language of the resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "language"@en-us ;
+ rdfs:range dcterms:LinguisticSystem .
+
+dcterms:license
+ a rdf:Property ;
+ rdfs:comment "A legal document giving official permission to do something with the resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "license"@en-us ;
+ rdfs:range dcterms:LicenseDocument ;
+ rdfs:subPropertyOf dcterms:rights .
+
+dcterms:modified
+ a rdf:Property ;
+ rdfs:comment "Date on which the resource was changed."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "date modified"@en-us ;
+ rdfs:range rdfs:Literal ;
+ rdfs:subPropertyOf dcterms:date .
+
+dcterms:publisher
+ a rdf:Property ;
+ dcterms:description "Examples of a Publisher include a person, an organization, or a service."@en-us ;
+ rdfs:comment "An entity responsible for making the resource available."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "publisher"@en-us ;
+ rdfs:range dcterms:Agent .
+
+dcterms:references
+ a rdf:Property ;
+ rdfs:comment "A related resource that is referenced, cited, or otherwise pointed to by the described resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "references"@en-us ;
+ rdfs:subPropertyOf dcterms:relation .
+
+dcterms:relation
+ a rdf:Property ;
+ dcterms:description "Recommended best practice is to identify the related resource by means of a string conforming to a formal identification system. "@en-us ;
+ rdfs:comment "A related resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "relation"@en-us .
+
+dcterms:replaces
+ a rdf:Property ;
+ rdfs:comment "A related resource that is supplanted, displaced, or superseded by the described resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "replaces"@en-us ;
+ rdfs:subPropertyOf dcterms:relation .
+
+dcterms:requires
+ a rdf:Property ;
+ rdfs:comment "A related resource that is required by the described resource to support its function, delivery, or coherence."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "requires"@en-us ;
+ rdfs:subPropertyOf dcterms:relation .
+
+dcterms:rights
+ a rdf:Property ;
+ dcterms:description "Typically, rights information includes a statement about various property rights associated with the resource, including intellectual property rights."@en-us ;
+ rdfs:comment "Information about rights held in and over the resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "rights"@en-us ;
+ rdfs:range dcterms:RightsStatement .
+
+dcterms:rightsHolder
+ a rdf:Property ;
+ rdfs:comment "A person or organization owning or managing rights over the resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "rights holder"@en-us ;
+ rdfs:range dcterms:Agent .
+
+dcterms:title
+ a rdf:Property ;
+ rdfs:comment "A name given to the resource."@en-us ;
+ rdfs:isDefinedBy dcterms: ;
+ rdfs:label "title"@en-us ;
+ rdfs:range rdfs:Literal .
diff --git a/schemas/owl.ttl b/schemas/owl.ttl
new file mode 100644
index 00000000..3f1c86ea
--- /dev/null
+++ b/schemas/owl.ttl
@@ -0,0 +1,615 @@
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix dct: <http://purl.org/dc/terms/> .
+
+<http://www.w3.org/2002/07/owl>
+ dct:title "The OWL 2 Schema vocabulary (OWL 2)" ;
+ a owl:Ontology ;
+ rdfs:comment """
+ This ontology partially describes the built-in classes and
+ properties that together form the basis of the RDF/XML syntax of OWL 2.
+ The content of this ontology is based on Tables 6.1 and 6.2
+ in Section 6.4 of the OWL 2 RDF-Based Semantics specification,
+ available at http://www.w3.org/TR/owl2-rdf-based-semantics/.
+ Please note that those tables do not include the different annotations
+ (labels, comments and rdfs:isDefinedBy links) used in this file.
+ Also note that the descriptions provided in this ontology do not
+ provide a complete and correct formal description of either the syntax
+ or the semantics of the introduced terms (please see the OWL 2
+ recommendations for the complete and normative specifications).
+ Furthermore, the information provided by this ontology may be
+ misleading if not used with care. This ontology SHOULD NOT be imported
+ into OWL ontologies. Importing this file into an OWL 2 DL ontology
+ will cause it to become an OWL 2 Full ontology and may have other,
+ unexpected, consequences.
+ """ ;
+ rdfs:isDefinedBy <http://www.w3.org/TR/owl2-mapping-to-rdf/>, <http://www.w3.org/TR/owl2-rdf-based-semantics/>, <http://www.w3.org/TR/owl2-syntax/> ;
+ rdfs:seeAlso <http://www.w3.org/TR/owl2-rdf-based-semantics/#table-axiomatic-classes>, <http://www.w3.org/TR/owl2-rdf-based-semantics/#table-axiomatic-properties> ;
+ owl:imports rdfs: ;
+ owl:versionIRI <http://www.w3.org/2002/07/owl> ;
+ owl:versionInfo "$Date: 2009/11/15 10:54:12 $" .
+
+owl:AllDifferent
+ a rdfs:Class ;
+ rdfs:comment "The class of collections of pairwise different individuals." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "AllDifferent" ;
+ rdfs:subClassOf rdfs:Resource .
+
+owl:AllDisjointClasses
+ a rdfs:Class ;
+ rdfs:comment "The class of collections of pairwise disjoint classes." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "AllDisjointClasses" ;
+ rdfs:subClassOf rdfs:Resource .
+
+owl:AllDisjointProperties
+ a rdfs:Class ;
+ rdfs:comment "The class of collections of pairwise disjoint properties." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "AllDisjointProperties" ;
+ rdfs:subClassOf rdfs:Resource .
+
+owl:Annotation
+ a rdfs:Class ;
+ rdfs:comment "The class of annotated annotations for which the RDF serialization consists of an annotated subject, predicate and object." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "Annotation" ;
+ rdfs:subClassOf rdfs:Resource .
+
+owl:AnnotationProperty
+ a rdfs:Class ;
+ rdfs:comment "The class of annotation properties." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "AnnotationProperty" ;
+ rdfs:subClassOf rdf:Property .
+
+owl:AsymmetricProperty
+ a rdfs:Class ;
+ rdfs:comment "The class of asymmetric properties." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "AsymmetricProperty" ;
+ rdfs:subClassOf owl:ObjectProperty .
+
+owl:Axiom
+ a rdfs:Class ;
+ rdfs:comment "The class of annotated axioms for which the RDF serialization consists of an annotated subject, predicate and object." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "Axiom" ;
+ rdfs:subClassOf rdfs:Resource .
+
+owl:Class
+ a rdfs:Class ;
+ rdfs:comment "The class of OWL classes." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "Class" ;
+ rdfs:subClassOf rdfs:Class .
+
+owl:DatatypeProperty
+ a rdfs:Class ;
+ rdfs:comment "The class of data properties." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "DatatypeProperty" ;
+ rdfs:subClassOf rdf:Property .
+
+owl:DeprecatedClass
+ a rdfs:Class ;
+ rdfs:comment "The class of deprecated classes." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "DeprecatedClass" ;
+ rdfs:subClassOf rdfs:Class .
+
+owl:DeprecatedProperty
+ a rdfs:Class ;
+ rdfs:comment "The class of deprecated properties." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "DeprecatedProperty" ;
+ rdfs:subClassOf rdf:Property .
+
+owl:FunctionalProperty
+ a rdfs:Class ;
+ rdfs:comment "The class of functional properties." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "FunctionalProperty" ;
+ rdfs:subClassOf rdf:Property .
+
+owl:InverseFunctionalProperty
+ a rdfs:Class ;
+ rdfs:comment "The class of inverse-functional properties." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "InverseFunctionalProperty" ;
+ rdfs:subClassOf owl:ObjectProperty .
+
+owl:IrreflexiveProperty
+ a rdfs:Class ;
+ rdfs:comment "The class of irreflexive properties." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "IrreflexiveProperty" ;
+ rdfs:subClassOf owl:ObjectProperty .
+
+owl:NamedIndividual
+ a rdfs:Class ;
+ rdfs:comment "The class of named individuals." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "NamedIndividual" ;
+ rdfs:subClassOf owl:Thing .
+
+owl:NegativePropertyAssertion
+ a rdfs:Class ;
+ rdfs:comment "The class of negative property assertions." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "NegativePropertyAssertion" ;
+ rdfs:subClassOf rdfs:Resource .
+
+owl:Nothing
+ a owl:Class ;
+ rdfs:comment "This is the empty class." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "Nothing" ;
+ rdfs:subClassOf owl:Thing .
+
+owl:ObjectProperty
+ a rdfs:Class ;
+ rdfs:comment "The class of object properties." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "ObjectProperty" ;
+ rdfs:subClassOf rdf:Property .
+
+owl:Ontology
+ a rdfs:Class ;
+ rdfs:comment "The class of ontologies." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "Ontology" ;
+ rdfs:subClassOf rdfs:Resource .
+
+owl:OntologyProperty
+ a rdfs:Class ;
+ rdfs:comment "The class of ontology properties." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "OntologyProperty" ;
+ rdfs:subClassOf rdf:Property .
+
+owl:ReflexiveProperty
+ a rdfs:Class ;
+ rdfs:comment "The class of reflexive properties." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "ReflexiveProperty" ;
+ rdfs:subClassOf owl:ObjectProperty .
+
+owl:Restriction
+ a rdfs:Class ;
+ rdfs:comment "The class of property restrictions." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "Restriction" ;
+ rdfs:subClassOf owl:Class .
+
+owl:SymmetricProperty
+ a rdfs:Class ;
+ rdfs:comment "The class of symmetric properties." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "SymmetricProperty" ;
+ rdfs:subClassOf owl:ObjectProperty .
+
+owl:Thing
+ a owl:Class ;
+ rdfs:comment "The class of OWL individuals." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "Thing" .
+
+owl:TransitiveProperty
+ a rdfs:Class ;
+ rdfs:comment "The class of transitive properties." ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "TransitiveProperty" ;
+ rdfs:subClassOf owl:ObjectProperty .
+
+owl:allValuesFrom
+ a rdf:Property ;
+ rdfs:comment "The property that determines the class that a universal property restriction refers to." ;
+ rdfs:domain owl:Restriction ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "all values from" ;
+ rdfs:range rdfs:Class .
+
+owl:annotatedProperty
+ a rdf:Property ;
+ rdfs:comment "The property that determines the predicate of an annotated axiom or annotated annotation." ;
+ rdfs:domain rdfs:Resource ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "annotated property" ;
+ rdfs:range rdfs:Resource .
+
+owl:annotatedSource
+ a rdf:Property ;
+ rdfs:comment "The property that determines the subject of an annotated axiom or annotated annotation." ;
+ rdfs:domain rdfs:Resource ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "annotated source" ;
+ rdfs:range rdfs:Resource .
+
+owl:annotatedTarget
+ a rdf:Property ;
+ rdfs:comment "The property that determines the object of an annotated axiom or annotated annotation." ;
+ rdfs:domain rdfs:Resource ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "annotated target" ;
+ rdfs:range rdfs:Resource .
+
+owl:assertionProperty
+ a rdf:Property ;
+ rdfs:comment "The property that determines the predicate of a negative property assertion." ;
+ rdfs:domain owl:NegativePropertyAssertion ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "assertion property" ;
+ rdfs:range rdf:Property .
+
+owl:backwardCompatibleWith
+ a owl:AnnotationProperty, owl:OntologyProperty ;
+ rdfs:comment "The annotation property that indicates that a given ontology is backward compatible with another ontology." ;
+ rdfs:domain owl:Ontology ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "backward compatible with" ;
+ rdfs:range owl:Ontology .
+
+owl:bottomDataProperty
+ a owl:DatatypeProperty ;
+ rdfs:comment "The data property that does not relate any individual to any data value." ;
+ rdfs:domain owl:Thing ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "bottom data property" ;
+ rdfs:range rdfs:Literal .
+
+owl:bottomObjectProperty
+ a owl:ObjectProperty ;
+ rdfs:comment "The object property that does not relate any two individuals." ;
+ rdfs:domain owl:Thing ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "bottom object property" ;
+ rdfs:range owl:Thing .
+
+owl:cardinality
+ a rdf:Property ;
+ rdfs:comment "The property that determines the cardinality of an exact cardinality restriction." ;
+ rdfs:domain owl:Restriction ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "cardinality" ;
+ rdfs:range xsd:nonNegativeInteger .
+
+owl:complementOf
+ a rdf:Property ;
+ rdfs:comment "The property that determines that a given class is the complement of another class." ;
+ rdfs:domain owl:Class ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "complement of" ;
+ rdfs:range owl:Class .
+
+owl:datatypeComplementOf
+ a rdf:Property ;
+ rdfs:comment "The property that determines that a given data range is the complement of another data range with respect to the data domain." ;
+ rdfs:domain rdfs:Datatype ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "datatype complement of" ;
+ rdfs:range rdfs:Datatype .
+
+owl:deprecated
+ a owl:AnnotationProperty ;
+ rdfs:comment "The annotation property that indicates that a given entity has been deprecated." ;
+ rdfs:domain rdfs:Resource ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "deprecated" ;
+ rdfs:range rdfs:Resource .
+
+owl:differentFrom
+ a rdf:Property ;
+ rdfs:comment "The property that determines that two given individuals are different." ;
+ rdfs:domain owl:Thing ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "different from" ;
+ rdfs:range owl:Thing .
+
+owl:disjointUnionOf
+ a rdf:Property ;
+ rdfs:comment "The property that determines that a given class is equivalent to the disjoint union of a collection of other classes." ;
+ rdfs:domain owl:Class ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "disjoint union of" ;
+ rdfs:range rdf:List .
+
+owl:disjointWith
+ a rdf:Property ;
+ rdfs:comment "The property that determines that two given classes are disjoint." ;
+ rdfs:domain owl:Class ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "disjoint with" ;
+ rdfs:range owl:Class .
+
+owl:distinctMembers
+ a rdf:Property ;
+ rdfs:comment "The property that determines the collection of pairwise different individuals in a owl:AllDifferent axiom." ;
+ rdfs:domain owl:AllDifferent ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "distinct members" ;
+ rdfs:range rdf:List .
+
+owl:equivalentClass
+ a rdf:Property ;
+ rdfs:comment "The property that determines that two given classes are equivalent, and that is used to specify datatype definitions." ;
+ rdfs:domain rdfs:Class ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "equivalent class" ;
+ rdfs:range rdfs:Class .
+
+owl:equivalentProperty
+ a rdf:Property ;
+ rdfs:comment "The property that determines that two given properties are equivalent." ;
+ rdfs:domain rdf:Property ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "equivalent property" ;
+ rdfs:range rdf:Property .
+
+owl:hasKey
+ a rdf:Property ;
+ rdfs:comment "The property that determines the collection of properties that jointly build a key." ;
+ rdfs:domain owl:Class ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "has key" ;
+ rdfs:range rdf:List .
+
+owl:hasSelf
+ a rdf:Property ;
+ rdfs:comment "The property that determines the property that a self restriction refers to." ;
+ rdfs:domain owl:Restriction ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "has self" ;
+ rdfs:range rdfs:Resource .
+
+owl:hasValue
+ a rdf:Property ;
+ rdfs:comment "The property that determines the individual that a has-value restriction refers to." ;
+ rdfs:domain owl:Restriction ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "has value" ;
+ rdfs:range rdfs:Resource .
+
+owl:imports
+ a owl:OntologyProperty ;
+ rdfs:comment "The property that is used for importing other ontologies into a given ontology." ;
+ rdfs:domain owl:Ontology ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "imports" ;
+ rdfs:range owl:Ontology .
+
+owl:incompatibleWith
+ a owl:AnnotationProperty, owl:OntologyProperty ;
+ rdfs:comment "The annotation property that indicates that a given ontology is incompatible with another ontology." ;
+ rdfs:domain owl:Ontology ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "incompatible with" ;
+ rdfs:range owl:Ontology .
+
+owl:intersectionOf
+ a rdf:Property ;
+ rdfs:comment "The property that determines the collection of classes or data ranges that build an intersection." ;
+ rdfs:domain rdfs:Class ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "intersection of" ;
+ rdfs:range rdf:List .
+
+owl:inverseOf
+ a rdf:Property ;
+ rdfs:comment "The property that determines that two given properties are inverse." ;
+ rdfs:domain owl:ObjectProperty ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "inverse of" ;
+ rdfs:range owl:ObjectProperty .
+
+owl:maxCardinality
+ a rdf:Property ;
+ rdfs:comment "The property that determines the cardinality of a maximum cardinality restriction." ;
+ rdfs:domain owl:Restriction ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "max cardinality" ;
+ rdfs:range xsd:nonNegativeInteger .
+
+owl:maxQualifiedCardinality
+ a rdf:Property ;
+ rdfs:comment "The property that determines the cardinality of a maximum qualified cardinality restriction." ;
+ rdfs:domain owl:Restriction ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "max qualified cardinality" ;
+ rdfs:range xsd:nonNegativeInteger .
+
+owl:members
+ a rdf:Property ;
+ rdfs:comment "The property that determines the collection of members in either a owl:AllDifferent, owl:AllDisjointClasses or owl:AllDisjointProperties axiom." ;
+ rdfs:domain rdfs:Resource ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "members" ;
+ rdfs:range rdf:List .
+
+owl:minCardinality
+ a rdf:Property ;
+ rdfs:comment "The property that determines the cardinality of a minimum cardinality restriction." ;
+ rdfs:domain owl:Restriction ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "min cardinality" ;
+ rdfs:range xsd:nonNegativeInteger .
+
+owl:minQualifiedCardinality
+ a rdf:Property ;
+ rdfs:comment "The property that determines the cardinality of a minimum qualified cardinality restriction." ;
+ rdfs:domain owl:Restriction ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "min qualified cardinality" ;
+ rdfs:range xsd:nonNegativeInteger .
+
+owl:onClass
+ a rdf:Property ;
+ rdfs:comment "The property that determines the class that a qualified object cardinality restriction refers to." ;
+ rdfs:domain owl:Restriction ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "on class" ;
+ rdfs:range owl:Class .
+
+owl:onDataRange
+ a rdf:Property ;
+ rdfs:comment "The property that determines the data range that a qualified data cardinality restriction refers to." ;
+ rdfs:domain owl:Restriction ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "on data range" ;
+ rdfs:range rdfs:Datatype .
+
+owl:onDatatype
+ a rdf:Property ;
+ rdfs:comment "The property that determines the datatype that a datatype restriction refers to." ;
+ rdfs:domain rdfs:Datatype ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "on datatype" ;
+ rdfs:range rdfs:Datatype .
+
+owl:onProperties
+ a rdf:Property ;
+ rdfs:comment "The property that determines the n-tuple of properties that a property restriction on an n-ary data range refers to." ;
+ rdfs:domain owl:Restriction ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "on properties" ;
+ rdfs:range rdf:List .
+
+owl:onProperty
+ a rdf:Property ;
+ rdfs:comment "The property that determines the property that a property restriction refers to." ;
+ rdfs:domain owl:Restriction ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "on property" ;
+ rdfs:range rdf:Property .
+
+owl:oneOf
+ a rdf:Property ;
+ rdfs:comment "The property that determines the collection of individuals or data values that build an enumeration." ;
+ rdfs:domain rdfs:Class ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "one of" ;
+ rdfs:range rdf:List .
+
+owl:priorVersion
+ a owl:AnnotationProperty, owl:OntologyProperty ;
+ rdfs:comment "The annotation property that indicates the predecessor ontology of a given ontology." ;
+ rdfs:domain owl:Ontology ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "prior version" ;
+ rdfs:range owl:Ontology .
+
+owl:propertyChainAxiom
+ a rdf:Property ;
+ rdfs:comment "The property that determines the n-tuple of properties that build a sub property chain of a given property." ;
+ rdfs:domain owl:ObjectProperty ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "property chain axiom" ;
+ rdfs:range rdf:List .
+
+owl:propertyDisjointWith
+ a rdf:Property ;
+ rdfs:comment "The property that determines that two given properties are disjoint." ;
+ rdfs:domain rdf:Property ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "property disjoint with" ;
+ rdfs:range rdf:Property .
+
+owl:qualifiedCardinality
+ a rdf:Property ;
+ rdfs:comment "The property that determines the cardinality of an exact qualified cardinality restriction." ;
+ rdfs:domain owl:Restriction ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "qualified cardinality" ;
+ rdfs:range xsd:nonNegativeInteger .
+
+owl:sameAs
+ a rdf:Property ;
+ rdfs:comment "The property that determines that two given individuals are equal." ;
+ rdfs:domain owl:Thing ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "same as" ;
+ rdfs:range owl:Thing .
+
+owl:someValuesFrom
+ a rdf:Property ;
+ rdfs:comment "The property that determines the class that an existential property restriction refers to." ;
+ rdfs:domain owl:Restriction ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "some values from" ;
+ rdfs:range rdfs:Class .
+
+owl:sourceIndividual
+ a rdf:Property ;
+ rdfs:comment "The property that determines the subject of a negative property assertion." ;
+ rdfs:domain owl:NegativePropertyAssertion ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "source individual" ;
+ rdfs:range owl:Thing .
+
+owl:targetIndividual
+ a rdf:Property ;
+ rdfs:comment "The property that determines the object of a negative object property assertion." ;
+ rdfs:domain owl:NegativePropertyAssertion ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "target individual" ;
+ rdfs:range owl:Thing .
+
+owl:targetValue
+ a rdf:Property ;
+ rdfs:comment "The property that determines the value of a negative data property assertion." ;
+ rdfs:domain owl:NegativePropertyAssertion ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "target value" ;
+ rdfs:range rdfs:Literal .
+
+owl:topDataProperty
+ a owl:DatatypeProperty ;
+ rdfs:comment "The data property that relates every individual to every data value." ;
+ rdfs:domain owl:Thing ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "top data property" ;
+ rdfs:range rdfs:Literal .
+
+owl:topObjectProperty
+ a owl:ObjectProperty ;
+ rdfs:comment "The object property that relates every two individuals." ;
+ rdfs:domain owl:Thing ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "top object property" ;
+ rdfs:range owl:Thing .
+
+owl:unionOf
+ a rdf:Property ;
+ rdfs:comment "The property that determines the collection of classes or data ranges that build a union." ;
+ rdfs:domain rdfs:Class ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "union of" ;
+ rdfs:range rdf:List .
+
+owl:versionIRI
+ a owl:OntologyProperty ;
+ rdfs:comment "The property that identifies the version IRI of an ontology." ;
+ rdfs:domain owl:Ontology ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "version IRI" ;
+ rdfs:range owl:Ontology .
+
+owl:versionInfo
+ a owl:AnnotationProperty ;
+ rdfs:comment "The annotation property that provides version information for an ontology or another OWL construct." ;
+ rdfs:domain rdfs:Resource ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "version info" ;
+ rdfs:range rdfs:Resource .
+
+owl:withRestrictions
+ a rdf:Property ;
+ rdfs:comment "The property that determines the collection of facet-value pairs that define a datatype restriction." ;
+ rdfs:domain rdfs:Datatype ;
+ rdfs:isDefinedBy <http://www.w3.org/2002/07/owl#> ;
+ rdfs:label "with restrictions" ;
+ rdfs:range rdf:List .
+
diff --git a/schemas/rdf.ttl b/schemas/rdf.ttl
new file mode 100644
index 00000000..a4dd8ef7
--- /dev/null
+++ b/schemas/rdf.ttl
@@ -0,0 +1,129 @@
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix dct: <http://purl.org/dc/terms/> .
+
+<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
+ dct:description "This is the RDF Schema for the RDF vocabulary defined in the RDF namespace." ;
+ dct:title "The RDF Vocabulary (RDF)" ;
+ a owl:Ontology ;
+ rdfs:seeAlso <http://www.w3.org/2000/01/rdf-schema-more> .
+
+rdf:Alt
+ a rdfs:Class ;
+ rdfs:comment "The class of containers of alternatives." ;
+ rdfs:isDefinedBy <http://www.w3.org/1999/02/22-rdf-syntax-ns#> ;
+ rdfs:label "Alt" ;
+ rdfs:subClassOf rdfs:Container .
+
+rdf:Bag
+ a rdfs:Class ;
+ rdfs:comment "The class of unordered containers." ;
+ rdfs:isDefinedBy <http://www.w3.org/1999/02/22-rdf-syntax-ns#> ;
+ rdfs:label "Bag" ;
+ rdfs:subClassOf rdfs:Container .
+
+rdf:List
+ a rdfs:Class ;
+ rdfs:comment "The class of RDF Lists." ;
+ rdfs:isDefinedBy <http://www.w3.org/1999/02/22-rdf-syntax-ns#> ;
+ rdfs:label "List" ;
+ rdfs:subClassOf rdfs:Resource .
+
+rdf:PlainLiteral
+ a rdfs:Datatype ;
+ rdfs:comment "The class of plain (i.e. untyped) literal values." ;
+ rdfs:isDefinedBy <http://www.w3.org/TR/rdf-plain-literal/> ;
+ rdfs:label "Plain Literal" ;
+ rdfs:subClassOf rdfs:Literal .
+
+rdf:Property
+ a rdfs:Class ;
+ rdfs:comment "The class of RDF properties." ;
+ rdfs:isDefinedBy <http://www.w3.org/1999/02/22-rdf-syntax-ns#> ;
+ rdfs:label "Property" ;
+ rdfs:subClassOf rdfs:Resource .
+
+rdf:Seq
+ a rdfs:Class ;
+ rdfs:comment "The class of ordered containers." ;
+ rdfs:isDefinedBy <http://www.w3.org/1999/02/22-rdf-syntax-ns#> ;
+ rdfs:label "Seq" ;
+ rdfs:subClassOf rdfs:Container .
+
+rdf:Statement
+ a rdfs:Class ;
+ rdfs:comment "The class of RDF statements." ;
+ rdfs:isDefinedBy <http://www.w3.org/1999/02/22-rdf-syntax-ns#> ;
+ rdfs:label "Statement" ;
+ rdfs:subClassOf rdfs:Resource .
+
+rdf:XMLLiteral
+ a rdfs:Datatype ;
+ rdfs:comment "The class of XML literal values." ;
+ rdfs:isDefinedBy <http://www.w3.org/1999/02/22-rdf-syntax-ns#> ;
+ rdfs:label "XML Literal" ;
+ rdfs:subClassOf rdfs:Literal .
+
+rdf:first
+ a rdf:Property ;
+ rdfs:comment "The first item in the subject RDF list." ;
+ rdfs:domain rdf:List ;
+ rdfs:isDefinedBy <http://www.w3.org/1999/02/22-rdf-syntax-ns#> ;
+ rdfs:label "first" ;
+ rdfs:range rdfs:Resource .
+
+rdf:nil
+ a rdf:List ;
+ rdfs:comment "The empty list, with no items in it. If the rest of a list is nil then the list has no more items in it." ;
+ rdfs:isDefinedBy <http://www.w3.org/1999/02/22-rdf-syntax-ns#> ;
+ rdfs:label "nil" .
+
+rdf:object
+ a rdf:Property ;
+ rdfs:comment "The object of the subject RDF statement." ;
+ rdfs:domain rdf:Statement ;
+ rdfs:isDefinedBy <http://www.w3.org/1999/02/22-rdf-syntax-ns#> ;
+ rdfs:label "object" ;
+ rdfs:range rdfs:Resource .
+
+rdf:predicate
+ a rdf:Property ;
+ rdfs:comment "The predicate of the subject RDF statement." ;
+ rdfs:domain rdf:Statement ;
+ rdfs:isDefinedBy <http://www.w3.org/1999/02/22-rdf-syntax-ns#> ;
+ rdfs:label "predicate" ;
+ rdfs:range rdfs:Resource .
+
+rdf:rest
+ a rdf:Property ;
+ rdfs:comment "The rest of the subject RDF list after the first item." ;
+ rdfs:domain rdf:List ;
+ rdfs:isDefinedBy <http://www.w3.org/1999/02/22-rdf-syntax-ns#> ;
+ rdfs:label "rest" ;
+ rdfs:range rdf:List .
+
+rdf:subject
+ a rdf:Property ;
+ rdfs:comment "The subject of the subject RDF statement." ;
+ rdfs:domain rdf:Statement ;
+ rdfs:isDefinedBy <http://www.w3.org/1999/02/22-rdf-syntax-ns#> ;
+ rdfs:label "subject" ;
+ rdfs:range rdfs:Resource .
+
+rdf:type
+ a rdf:Property ;
+ rdfs:comment "The subject is an instance of a class." ;
+ rdfs:domain rdfs:Resource ;
+ rdfs:isDefinedBy <http://www.w3.org/1999/02/22-rdf-syntax-ns#> ;
+ rdfs:label "type" ;
+ rdfs:range rdfs:Class .
+
+rdf:value
+ a rdf:Property ;
+ rdfs:comment "Idiomatic property used for structured values." ;
+ rdfs:domain rdfs:Resource ;
+ rdfs:isDefinedBy <http://www.w3.org/1999/02/22-rdf-syntax-ns#> ;
+ rdfs:label "value" ;
+ rdfs:range rdfs:Resource .
+
diff --git a/schemas/rdfs.ttl b/schemas/rdfs.ttl
new file mode 100644
index 00000000..078d7c8b
--- /dev/null
+++ b/schemas/rdfs.ttl
@@ -0,0 +1,124 @@
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix dct: <http://purl.org/dc/terms/> .
+
+<http://www.w3.org/2000/01/rdf-schema#>
+ dct:title "The RDF Schema vocabulary (RDFS)" ;
+ a owl:Ontology ;
+ rdfs:seeAlso <http://www.w3.org/2000/01/rdf-schema-more> .
+
+rdfs:Class
+ a rdfs:Class ;
+ rdfs:comment "The class of classes." ;
+ rdfs:isDefinedBy <http://www.w3.org/2000/01/rdf-schema#> ;
+ rdfs:label "Class" ;
+ rdfs:subClassOf rdfs:Resource .
+
+rdfs:Container
+ a rdfs:Class ;
+ rdfs:comment "The class of RDF containers." ;
+ rdfs:isDefinedBy <http://www.w3.org/2000/01/rdf-schema#> ;
+ rdfs:label "Container" ;
+ rdfs:subClassOf rdfs:Resource .
+
+rdfs:ContainerMembershipProperty
+ a rdfs:Class ;
+ rdfs:comment "The class of container membership properties, rdf:_1, rdf:_2, ..., all of which are sub-properties of 'member'." ;
+ rdfs:isDefinedBy <http://www.w3.org/2000/01/rdf-schema#> ;
+ rdfs:label "Container Membership Property" ;
+ rdfs:subClassOf rdf:Property .
+
+rdfs:Datatype
+ a rdfs:Class ;
+ rdfs:comment "The class of RDF datatypes." ;
+ rdfs:isDefinedBy <http://www.w3.org/2000/01/rdf-schema#> ;
+ rdfs:label "Datatype" ;
+ rdfs:subClassOf rdfs:Class .
+
+rdfs:Literal
+ a rdfs:Class ;
+ rdfs:comment "The class of literal values, eg. textual strings and integers." ;
+ rdfs:isDefinedBy <http://www.w3.org/2000/01/rdf-schema#> ;
+ rdfs:label "Literal" ;
+ rdfs:subClassOf rdfs:Resource .
+
+rdfs:Resource
+ a rdfs:Class ;
+ rdfs:comment "The class resource, everything." ;
+ rdfs:isDefinedBy <http://www.w3.org/2000/01/rdf-schema#> ;
+ rdfs:label "Resource" .
+
+rdfs:comment
+ a rdf:Property ;
+ rdfs:comment "A description of the subject resource." ;
+ rdfs:domain rdfs:Resource ;
+ rdfs:isDefinedBy <http://www.w3.org/2000/01/rdf-schema#> ;
+ rdfs:label "comment" ;
+ rdfs:range rdfs:Literal .
+
+rdfs:domain
+ a rdf:Property ;
+ rdfs:comment "A domain of the subject property." ;
+ rdfs:domain rdf:Property ;
+ rdfs:isDefinedBy <http://www.w3.org/2000/01/rdf-schema#> ;
+ rdfs:label "domain" ;
+ rdfs:range rdfs:Class .
+
+rdfs:isDefinedBy
+ a rdf:Property ;
+ rdfs:comment "The defininition of the subject resource." ;
+ rdfs:domain rdfs:Resource ;
+ rdfs:isDefinedBy <http://www.w3.org/2000/01/rdf-schema#> ;
+ rdfs:label "is defined by" ;
+ rdfs:range rdfs:Resource ;
+ rdfs:subPropertyOf rdfs:seeAlso .
+
+rdfs:label
+ a rdf:Property ;
+ rdfs:comment "A human-readable name for the subject." ;
+ rdfs:domain rdfs:Resource ;
+ rdfs:isDefinedBy <http://www.w3.org/2000/01/rdf-schema#> ;
+ rdfs:label "label" ;
+ rdfs:range rdfs:Literal .
+
+rdfs:member
+ a rdf:Property ;
+ rdfs:comment "A member of the subject resource." ;
+ rdfs:domain rdfs:Resource ;
+ rdfs:isDefinedBy <http://www.w3.org/2000/01/rdf-schema#> ;
+ rdfs:label "member" ;
+ rdfs:range rdfs:Resource .
+
+rdfs:range
+ a rdf:Property ;
+ rdfs:comment "A range of the subject property." ;
+ rdfs:domain rdf:Property ;
+ rdfs:isDefinedBy <http://www.w3.org/2000/01/rdf-schema#> ;
+ rdfs:label "range" ;
+ rdfs:range rdfs:Class .
+
+rdfs:seeAlso
+ a rdf:Property ;
+ rdfs:comment "Further information about the subject resource." ;
+ rdfs:domain rdfs:Resource ;
+ rdfs:isDefinedBy <http://www.w3.org/2000/01/rdf-schema#> ;
+ rdfs:label "see also" ;
+ rdfs:range rdfs:Resource .
+
+rdfs:subClassOf
+ a rdf:Property ;
+ rdfs:comment "The subject is a subclass of a class." ;
+ rdfs:domain rdfs:Class ;
+ rdfs:isDefinedBy <http://www.w3.org/2000/01/rdf-schema#> ;
+ rdfs:label "sub-class of" ;
+ rdfs:range rdfs:Class .
+
+rdfs:subPropertyOf
+ a rdf:Property ;
+ rdfs:comment "The subject is a subproperty of a property." ;
+ rdfs:domain rdf:Property ;
+ rdfs:isDefinedBy <http://www.w3.org/2000/01/rdf-schema#> ;
+ rdfs:label "sub-property of" ;
+ rdfs:range rdf:Property .
+
diff --git a/schemas/xsd.ttl b/schemas/xsd.ttl
new file mode 100644
index 00000000..46f6793a
--- /dev/null
+++ b/schemas/xsd.ttl
@@ -0,0 +1,353 @@
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
+
+<http://www.w3.org/2001/XMLSchema#>
+ a owl:Ontology ;
+ rdfs:comment "XML Schema Datatypes" .
+
+xsd:ID
+ a rdfs:Datatype ;
+ owl:onDatatype xsd:NCName .
+
+xsd:IDREF
+ a rdfs:Datatype ;
+ owl:onDatatype xsd:NCName .
+
+xsd:ENTITY
+ a rdfs:Datatype ;
+ owl:onDatatype xsd:NCName .
+
+xsd:NCName
+ a rdfs:Datatype ;
+ owl:onDatatype xsd:Name .
+
+xsd:NMTOKEN
+ a rdfs:Datatype ;
+ owl:onDatatype xsd:token .
+
+xsd:Name
+ a rdfs:Datatype ;
+ owl:onDatatype xsd:token .
+
+xsd:totalDigits
+ a rdf:Property ,
+ owl:DatatypeProperty ;
+ rdfs:range xsd:positiveInteger ;
+ rdfs:label "total digits" ;
+ rdfs:comment "The maximum number of decimal digits required to represent a value." .
+
+xsd:fractionDigits
+ a rdf:Property ,
+ owl:DatatypeProperty ;
+ rdfs:range xsd:nonNegativeInteger ;
+ rdfs:label "fraction digits" ;
+ rdfs:comment "The total number of digits to the right of the decimal point required to represent a value." .
+
+xsd:pattern
+ a rdf:Property ,
+ owl:DatatypeProperty ;
+ rdfs:label "pattern" ;
+ rdfs:comment "A regular expression that matches complete valid literals." .
+
+xsd:maxInclusive
+ a rdf:Property ,
+ owl:DatatypeProperty ;
+ rdfs:label "max inclusive" ;
+ rdfs:comment "The inclusive upper bound of an ordered datatype." .
+
+xsd:maxExclusive
+ a rdf:Property ,
+ owl:DatatypeProperty ;
+ rdfs:label "max exclusive" ;
+ rdfs:comment "The exclusive upper bound of an ordered datatype." .
+
+xsd:minInclusive
+ a rdf:Property ,
+ owl:DatatypeProperty ;
+ rdfs:label "min inclusive" ;
+ rdfs:comment "The inclusive lower bound of an ordered datatype." .
+
+xsd:minExclusive
+ a rdf:Property ,
+ owl:DatatypeProperty ;
+ rdfs:label "min exclusive" ;
+ rdfs:comment "The exclusive lower bound of an ordered datatype." .
+
+xsd:QName
+ a rdfs:Datatype ;
+ rdfs:label "XML qualified name" .
+
+xsd:anyURI
+ a rdfs:Datatype ;
+ rdfs:label "URI reference" .
+
+xsd:base64Binary
+ a rdfs:Datatype ;
+ rdfs:label "base64 binary" ;
+ rdfs:comment "Base64-encoded arbitrary binary data." ;
+ owl:withRestrictions (
+ [
+ xsd:pattern "(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?"
+ ]
+ ) .
+
+xsd:boolean
+ a rdfs:Datatype ;
+ rdfs:label "boolean" ;
+ owl:withRestrictions (
+ [
+ xsd:pattern "(true|false)"
+ ]
+ ) .
+
+xsd:byte
+ a rdfs:Datatype ;
+ rdfs:label "byte" ;
+ owl:onDatatype xsd:short ;
+ owl:withRestrictions (
+ [
+ xsd:maxInclusive 127
+ ] [
+ xsd:minInclusive -128
+ ]
+ ) .
+
+xsd:date
+ a rdfs:Datatype ;
+ rdfs:label "date" ;
+ owl:withRestrictions (
+ [
+ xsd:pattern "-?[0-9][0-9][0-9][0-9]([0-9]*)?-(0[1-9]|1[0-2])-([0-3][0-9])([+-]([0-1][0-9]|2[0-3]):[0-5][0-9])?"
+ ]
+ ) .
+
+xsd:dateTime
+ a rdfs:Datatype ;
+ rdfs:label "date time" .
+
+xsd:decimal
+ a rdfs:Datatype ;
+ rdfs:label "decimal" ;
+ rdfs:comment "A subset of the real numbers, which can be represented by decimal numerals." ;
+ owl:withRestrictions (
+ [
+ xsd:pattern "[+-]?[0-9]*\\.?[0-9]*"
+ ]
+ ) .
+
+xsd:double
+ a rdfs:Datatype ;
+ rdfs:label "double" ;
+ rdfs:comment "IEEE double-precision 64-bit floating point." ;
+ owl:withRestrictions (
+ [
+ xsd:pattern "[+-]?[0-9]*\\.?[0-9]*([eE][-+]?[0-9]+)?"
+ ]
+ ) .
+
+xsd:duration
+ a rdfs:Datatype ;
+ rdfs:label "duration" .
+
+xsd:float
+ a rdfs:Datatype ;
+ rdfs:label "float" ;
+ rdfs:comment "IEEE single-precision 32-bit floating point." ;
+ owl:onDatatype xsd:double .
+
+xsd:gDay
+ a rdfs:Datatype .
+
+xsd:gMonth
+ a rdfs:Datatype .
+
+xsd:gMonthDay
+ a rdfs:Datatype .
+
+xsd:gYear
+ a rdfs:Datatype .
+
+xsd:gYearMonth
+ a rdfs:Datatype .
+
+xsd:hexBinary
+ a rdfs:Datatype ;
+ rdfs:label "hex binary" ;
+ rdfs:comment "Hex-encoded arbitrary binary data." ;
+ owl:withRestrictions (
+ [
+ xsd:pattern "[0-9A-F]*"
+ ]
+ ) .
+
+xsd:int
+ a rdfs:Datatype ;
+ rdfs:label "int" ;
+ owl:onDatatype xsd:long ;
+ owl:withRestrictions (
+ [
+ xsd:maxInclusive 2147483647
+ ] [
+ xsd:minInclusive -2147483648
+ ]
+ ) .
+
+xsd:integer
+ a rdfs:Datatype ;
+ rdfs:label "integer" ;
+ owl:onDatatype xsd:decimal ;
+ owl:withRestrictions (
+ [
+ xsd:pattern "[-+]?[0-9]+"
+ ] [
+ xsd:fractionDigits 0
+ ]
+ ) .
+
+xsd:language
+ a rdfs:Datatype ;
+ rdfs:label "language" ;
+ owl:onDatatype xsd:token ;
+ owl:withRestrictions (
+ [
+ xsd:pattern "[a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*"
+ ]
+ ) .
+
+xsd:long
+ a rdfs:Datatype ;
+ rdfs:label "long" ;
+ owl:onDatatype xsd:integer ;
+ owl:withRestrictions (
+ [
+ xsd:maxInclusive 9223372036854775807
+ ] [
+ xsd:minInclusive -9223372036854775808
+ ]
+ ) .
+
+xsd:negativeInteger
+ a rdfs:Datatype ;
+ rdfs:label "negative integer" ;
+ owl:onDatatype xsd:nonPositiveInteger ;
+ owl:withRestrictions (
+ [
+ xsd:maxInclusive -1
+ ]
+ ) .
+
+xsd:nonNegativeInteger
+ a rdfs:Datatype ;
+ rdfs:label "non-negative integer" ;
+ owl:onDatatype xsd:integer ;
+ owl:withRestrictions (
+ [
+ xsd:pattern "[0-9]*"
+ ] [
+ xsd:minInclusive 0
+ ]
+ ) .
+
+xsd:nonPositiveInteger
+ a rdfs:Datatype ;
+ rdfs:label "non-positive integer" ;
+ owl:onDatatype xsd:integer ;
+ owl:withRestrictions (
+ [
+ xsd:pattern "(0|-[0-9]+)"
+ ] [
+ xsd:maxInclusive 0
+ ]
+ ) .
+
+xsd:normalizedString
+ a rdfs:Datatype ;
+ rdfs:label "normalized string" ;
+ owl:onDatatype xsd:string ;
+ rdfs:comment "The set of strings that do not contain the carriage return (#xD), line feed (#xA) nor tab (#x9) characters." .
+
+xsd:positiveInteger
+ a rdfs:Datatype ;
+ rdfs:label "positive integer" ;
+ owl:onDatatype xsd:nonNegativeInteger ;
+ owl:withRestrictions (
+ [
+ xsd:pattern "[+]?[0-9]+"
+ ] [
+ xsd:minInclusive 1
+ ]
+ ) .
+
+xsd:short
+ a rdfs:Datatype ;
+ rdfs:label "short" ;
+ owl:onDatatype xsd:int ;
+ owl:withRestrictions (
+ [
+ xsd:maxInclusive 32767
+ ] [
+ xsd:minInclusive -32768
+ ]
+ ) .
+
+xsd:string
+ a rdfs:Datatype ;
+ rdfs:label "string" ;
+ rdfs:comment "A character string." .
+
+xsd:time
+ a rdfs:Datatype ;
+ rdfs:label "time" ;
+ owl:withRestrictions (
+ [
+ xsd:pattern "[1-2][0-9]:[0-5][0-9]:[0-5][0-9].[0-9][0-9][0-9]"
+ ]
+ ) .
+
+xsd:token
+ a rdfs:Datatype ;
+ rdfs:label "token" ;
+ owl:onDatatype xsd:normalizedString ;
+ rdfs:comment "The set of strings that do not contain the carriage return (#xD), line feed (#xA) nor tab (#x9) characters, that have no leading or trailing spaces (#x20) and that have no internal sequences of two or more spaces." .
+
+xsd:unsignedByte
+ a rdfs:Datatype ;
+ rdfs:label "unsigned byte" ;
+ owl:onDatatype xsd:unsignedShort ;
+ owl:withRestrictions (
+ [
+ xsd:maxInclusive 255
+ ]
+ ) .
+
+xsd:unsignedInt
+ a rdfs:Datatype ;
+ rdfs:label "unsigned int" ;
+ owl:onDatatype xsd:unsignedLong ;
+ owl:withRestrictions (
+ [
+ xsd:maxInclusive 4294967295
+ ]
+ ) .
+
+xsd:unsignedLong
+ a rdfs:Datatype ;
+ rdfs:label "unsigned long" ;
+ owl:onDatatype xsd:nonNegativeInteger ;
+ owl:withRestrictions (
+ [
+ xsd:maxInclusive 18446744073709551615
+ ]
+ ) .
+
+xsd:unsignedShort
+ a rdfs:Datatype ;
+ rdfs:label "unsigned short" ;
+ owl:onDatatype xsd:unsignedInt ;
+ owl:withRestrictions (
+ [
+ xsd:maxInclusive 65535
+ ]
+ ) .
diff --git a/tests/validate/bad-all-values-from.ttl b/tests/validate/bad-all-values-from.ttl
new file mode 100644
index 00000000..e8243423
--- /dev/null
+++ b/tests/validate/bad-all-values-from.ttl
@@ -0,0 +1,18 @@
+@prefix eg: <http://example.org/> .
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+eg:Thing
+ a rdfs:Class ;
+ rdfs:subClassOf [
+ a owl:Restriction ;
+ owl:onProperty rdfs:label ;
+ owl:allValuesFrom rdf:PlainLiteral
+ ] .
+
+eg:s
+ a eg:Thing ;
+ rdfs:label "plain" ,
+ "not plain"^^rdf:XMLLiteral .
+
diff --git a/tests/validate/bad-cardinality-high.ttl b/tests/validate/bad-cardinality-high.ttl
new file mode 100644
index 00000000..7e1605c3
--- /dev/null
+++ b/tests/validate/bad-cardinality-high.ttl
@@ -0,0 +1,18 @@
+@prefix eg: <http://example.org/> .
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+eg:Thing
+ a rdfs:Class ;
+ rdfs:subClassOf [
+ a owl:Restriction ;
+ owl:onProperty rdf:value ;
+ owl:maxCardinality 1
+ ] .
+
+eg:s
+ a eg:Thing ;
+ rdf:value 1 ,
+ 2 .
+
diff --git a/tests/validate/bad-cardinality-low.ttl b/tests/validate/bad-cardinality-low.ttl
new file mode 100644
index 00000000..93dd0051
--- /dev/null
+++ b/tests/validate/bad-cardinality-low.ttl
@@ -0,0 +1,16 @@
+@prefix eg: <http://example.org/> .
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+eg:Thing
+ a rdfs:Class ;
+ rdfs:subClassOf [
+ a owl:Restriction ;
+ owl:onProperty rdf:value ;
+ owl:minCardinality 1
+ ] .
+
+eg:s
+ a eg:Thing .
+
diff --git a/tests/validate/bad-cardinality.ttl b/tests/validate/bad-cardinality.ttl
new file mode 100644
index 00000000..481fe456
--- /dev/null
+++ b/tests/validate/bad-cardinality.ttl
@@ -0,0 +1,18 @@
+@prefix eg: <http://example.org/> .
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+eg:Thing
+ a rdfs:Class ;
+ rdfs:subClassOf [
+ a owl:Restriction ;
+ owl:onProperty rdf:value ;
+ owl:cardinality 3
+ ] .
+
+eg:s
+ a eg:Thing ;
+ rdf:value 1 ,
+ 2 .
+
diff --git a/tests/validate/bad-datatype-property.ttl b/tests/validate/bad-datatype-property.ttl
new file mode 100644
index 00000000..a3e993f3
--- /dev/null
+++ b/tests/validate/bad-datatype-property.ttl
@@ -0,0 +1,18 @@
+@prefix eg: <http://example.org/> .
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+eg:value
+ rdfs:label "value" ;
+ a owl:DatatypeProperty .
+
+eg:Thing
+ a rdfs:Class .
+
+eg:s1
+ a eg:Thing .
+
+eg:s2
+ eg:value eg:s1 .
+
diff --git a/tests/validate/bad-domain.ttl b/tests/validate/bad-domain.ttl
new file mode 100644
index 00000000..d36b5652
--- /dev/null
+++ b/tests/validate/bad-domain.ttl
@@ -0,0 +1,19 @@
+@prefix eg: <http://example.org/> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+eg:Thing
+ a rdfs:Class .
+
+eg:NonThing
+ a rdfs:Class .
+
+eg:value
+ a rdf:Property ;
+ rdfs:label "value" ;
+ rdfs:domain eg:Thing .
+
+eg:nonthing
+ a eg:NonThing ;
+ eg:value 42 .
+
diff --git a/tests/validate/bad-functional-property.ttl b/tests/validate/bad-functional-property.ttl
new file mode 100644
index 00000000..53a73ccd
--- /dev/null
+++ b/tests/validate/bad-functional-property.ttl
@@ -0,0 +1,13 @@
+@prefix eg: <http://example.org/> .
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+eg:identity
+ rdfs:label "identity" ;
+ a owl:FunctionalProperty .
+
+eg:s
+ eg:identity "me" ,
+ "you" .
+
diff --git a/tests/validate/bad-inverse-functional-property.ttl b/tests/validate/bad-inverse-functional-property.ttl
new file mode 100644
index 00000000..95c0aaea
--- /dev/null
+++ b/tests/validate/bad-inverse-functional-property.ttl
@@ -0,0 +1,15 @@
+@prefix eg: <http://example.org/> .
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+eg:identity
+ rdfs:label "identity" ;
+ a owl:InverseFunctionalProperty .
+
+eg:s1
+ eg:identity "me" .
+
+eg:s2
+ eg:identity "me" .
+
diff --git a/tests/validate/bad-literal-pattern.ttl b/tests/validate/bad-literal-pattern.ttl
new file mode 100644
index 00000000..40f9eec0
--- /dev/null
+++ b/tests/validate/bad-literal-pattern.ttl
@@ -0,0 +1,7 @@
+@prefix eg: <http://example.org/> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
+
+eg:s
+ rdf:value "no"^^xsd:boolean .
+
diff --git a/tests/validate/bad-literal-value-high-exclusive.ttl b/tests/validate/bad-literal-value-high-exclusive.ttl
new file mode 100644
index 00000000..9e2bfe47
--- /dev/null
+++ b/tests/validate/bad-literal-value-high-exclusive.ttl
@@ -0,0 +1,18 @@
+@prefix eg: <http://example.org/> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
+
+eg:Normal
+ a rdfs:Datatype ;
+ rdfs:label "normal" ;
+ owl:onDatatype xsd:double ;
+ owl:withRestrictions (
+ [
+ xsd:maxExclusive 1.0
+ ] [
+ xsd:minExclusive 0.0
+ ]
+ ) .
+
+eg:s
+ rdf:value "1.0"^^eg:Normal .
diff --git a/tests/validate/bad-literal-value-high-inclusive.ttl b/tests/validate/bad-literal-value-high-inclusive.ttl
new file mode 100644
index 00000000..b58793ec
--- /dev/null
+++ b/tests/validate/bad-literal-value-high-inclusive.ttl
@@ -0,0 +1,18 @@
+@prefix eg: <http://example.org/> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
+
+eg:Normal
+ a rdfs:Datatype ;
+ rdfs:label "normal" ;
+ owl:onDatatype xsd:double ;
+ owl:withRestrictions (
+ [
+ xsd:maxInclusive 1.0
+ ] [
+ xsd:minInclusive 0.0
+ ]
+ ) .
+
+eg:s
+ rdf:value "1.1"^^eg:Normal .
diff --git a/tests/validate/bad-literal-value-low-exclusive.ttl b/tests/validate/bad-literal-value-low-exclusive.ttl
new file mode 100644
index 00000000..fdcaf94a
--- /dev/null
+++ b/tests/validate/bad-literal-value-low-exclusive.ttl
@@ -0,0 +1,18 @@
+@prefix eg: <http://example.org/> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
+
+eg:Normal
+ a rdfs:Datatype ;
+ rdfs:label "normal" ;
+ owl:onDatatype xsd:double ;
+ owl:withRestrictions (
+ [
+ xsd:maxExclusive 1.0
+ ] [
+ xsd:minExclusive 0.0
+ ]
+ ) .
+
+eg:s
+ rdf:value "0.0"^^eg:Normal .
diff --git a/tests/validate/bad-literal-value-low-inclusive.ttl b/tests/validate/bad-literal-value-low-inclusive.ttl
new file mode 100644
index 00000000..c88123dd
--- /dev/null
+++ b/tests/validate/bad-literal-value-low-inclusive.ttl
@@ -0,0 +1,19 @@
+@prefix eg: <http://example.org/> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
+
+eg:Normal
+ a rdfs:Datatype ;
+ rdfs:label "normal" ;
+ owl:onDatatype xsd:double ;
+ owl:withRestrictions (
+ [
+ xsd:maxInclusive 1.0
+ ] [
+ xsd:minInclusive 0.0
+ ]
+ ) .
+
+eg:s
+ rdf:value "-0.1"^^eg:Normal .
+
diff --git a/tests/validate/bad-object-property.ttl b/tests/validate/bad-object-property.ttl
new file mode 100644
index 00000000..b4a31f9d
--- /dev/null
+++ b/tests/validate/bad-object-property.ttl
@@ -0,0 +1,12 @@
+@prefix eg: <http://example.org/> .
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+eg:value
+ rdfs:label "value" ;
+ a owl:ObjectProperty .
+
+eg:s
+ eg:value "literal" .
+
diff --git a/tests/validate/bad-pattern.ttl b/tests/validate/bad-pattern.ttl
new file mode 100644
index 00000000..1c367bd2
--- /dev/null
+++ b/tests/validate/bad-pattern.ttl
@@ -0,0 +1,21 @@
+@prefix eg: <http://example.org/> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+eg:BrokenLiteral
+ a rdfs:Datatype ;
+ rdfs:label "broken literal" ;
+ owl:withRestrictions (
+ [
+ xsd:pattern "["
+ ]
+ ) .
+
+eg:value
+ a rdf:Property ;
+ rdfs:label "value" ;
+ rdfs:range eg:BinaryLiteral .
+
+eg:s
+ eg:value "no match"^^eg:BrokenLiteral .
+
diff --git a/tests/validate/bad-plain-literal.ttl b/tests/validate/bad-plain-literal.ttl
new file mode 100644
index 00000000..116faac0
--- /dev/null
+++ b/tests/validate/bad-plain-literal.ttl
@@ -0,0 +1,12 @@
+@prefix eg: <http://example.org/> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+eg:value
+ a rdf:Property ;
+ rdfs:label "value" ;
+ rdfs:range rdf:PlainLiteral .
+
+eg:s
+ eg:value "literal"^^rdf:XMLLiteral .
+
diff --git a/tests/validate/bad-range-instance-not-literal.ttl b/tests/validate/bad-range-instance-not-literal.ttl
new file mode 100644
index 00000000..ea7803f6
--- /dev/null
+++ b/tests/validate/bad-range-instance-not-literal.ttl
@@ -0,0 +1,18 @@
+@prefix eg: <http://example.org/> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+eg:Thing
+ a rdfs:Class .
+
+eg:value
+ a rdf:Property ;
+ rdfs:label "value" ;
+ rdfs:range rdfs:Literal .
+
+eg:thing
+ a eg:Thing .
+
+eg:s
+ eg:value eg:thing .
+
diff --git a/tests/validate/bad-range-instance.ttl b/tests/validate/bad-range-instance.ttl
new file mode 100644
index 00000000..a04a5476
--- /dev/null
+++ b/tests/validate/bad-range-instance.ttl
@@ -0,0 +1,21 @@
+@prefix eg: <http://example.org/> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+eg:Thing
+ a rdfs:Class .
+
+eg:NonThing
+ a rdfs:Class .
+
+eg:value
+ a rdf:Property ;
+ rdfs:label "value" ;
+ rdfs:range eg:Thing .
+
+eg:nonthing
+ a eg:NonThing .
+
+eg:s
+ eg:value eg:nonthing .
+
diff --git a/tests/validate/bad-range-literal-not-instance.ttl b/tests/validate/bad-range-literal-not-instance.ttl
new file mode 100644
index 00000000..f46de8ce
--- /dev/null
+++ b/tests/validate/bad-range-literal-not-instance.ttl
@@ -0,0 +1,15 @@
+@prefix eg: <http://example.org/> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+eg:Thing
+ a rdfs:Class .
+
+eg:value
+ a rdf:Property ;
+ rdfs:label "value" ;
+ rdfs:range eg:Thing .
+
+eg:s
+ eg:value "literal" .
+
diff --git a/tests/validate/bad-range-literal.ttl b/tests/validate/bad-range-literal.ttl
new file mode 100644
index 00000000..8a00a95f
--- /dev/null
+++ b/tests/validate/bad-range-literal.ttl
@@ -0,0 +1,21 @@
+@prefix eg: <http://example.org/> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+eg:BinaryLiteral
+ a rdfs:Datatype ;
+ rdfs:label "binary literal" ;
+ owl:withRestrictions (
+ [
+ xsd:pattern "(0|1)+"
+ ]
+ ) .
+
+eg:value
+ a rdf:Property ;
+ rdfs:label "value" ;
+ rdfs:range eg:BinaryLiteral .
+
+eg:s
+ eg:value "not binary"^^eg:BinaryLiteral .
+
diff --git a/tests/validate/bad-some-values-from.ttl b/tests/validate/bad-some-values-from.ttl
new file mode 100644
index 00000000..259bfb88
--- /dev/null
+++ b/tests/validate/bad-some-values-from.ttl
@@ -0,0 +1,18 @@
+@prefix eg: <http://example.org/> .
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+eg:Thing
+ a rdfs:Class ;
+ rdfs:subClassOf [
+ a owl:Restriction ;
+ owl:onProperty rdfs:label ;
+ owl:someValuesFrom rdf:PlainLiteral
+ ] .
+
+eg:s
+ a eg:Thing ;
+ rdfs:label "not plain"^^rdf:XMLLiteral .
+
+
diff --git a/tests/validate/bad-string-literal-value-high.ttl b/tests/validate/bad-string-literal-value-high.ttl
new file mode 100644
index 00000000..7119e30a
--- /dev/null
+++ b/tests/validate/bad-string-literal-value-high.ttl
@@ -0,0 +1,19 @@
+@prefix eg: <http://example.org/> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
+
+eg:startsWithC
+ a rdfs:Datatype ;
+ rdfs:label "starts with C" ;
+ owl:onDatatype xsd:string ;
+ owl:withRestrictions (
+ [
+ xsd:maxExclusive "D"
+ ] [
+ xsd:minInclusive "B"
+ ]
+ ) .
+
+eg:s
+ rdf:value "Door"^^eg:startsWithC .
+
diff --git a/tests/validate/bad-string-literal-value-low.ttl b/tests/validate/bad-string-literal-value-low.ttl
new file mode 100644
index 00000000..93c2f17e
--- /dev/null
+++ b/tests/validate/bad-string-literal-value-low.ttl
@@ -0,0 +1,19 @@
+@prefix eg: <http://example.org/> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
+
+eg:betweenBAndD
+ a rdfs:Datatype ;
+ rdfs:label "between B and D" ;
+ owl:onDatatype xsd:string ;
+ owl:withRestrictions (
+ [
+ xsd:maxInclusive "D"
+ ] [
+ xsd:minExclusive "B"
+ ]
+ ) .
+
+eg:s
+ rdf:value "Aardvark"^^eg:betweenBAndD .
+
diff --git a/tests/validate/bad-unknown-datatype.ttl b/tests/validate/bad-unknown-datatype.ttl
new file mode 100644
index 00000000..be2fc132
--- /dev/null
+++ b/tests/validate/bad-unknown-datatype.ttl
@@ -0,0 +1,6 @@
+@prefix eg: <http://example.org/> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+eg:s
+ rdfs:label "bad datatype"^^rdf:UndefinedLiteral .
+
diff --git a/tests/validate/bad-unknown-property.ttl b/tests/validate/bad-unknown-property.ttl
new file mode 100644
index 00000000..0db1e85c
--- /dev/null
+++ b/tests/validate/bad-unknown-property.ttl
@@ -0,0 +1,6 @@
+@prefix eg: <http://example.org/> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+eg:s
+ eg:undefined 0 .
+
diff --git a/tests/validate/manifest.ttl b/tests/validate/manifest.ttl
new file mode 100644
index 00000000..46d7574b
--- /dev/null
+++ b/tests/validate/manifest.ttl
@@ -0,0 +1,165 @@
+@prefix mf: <http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix rdft: <http://www.w3.org/ns/rdftest#> .
+@prefix serd: <http://drobilla.net/ns/serd#> .
+
+serd:TestTurtleNegativeValidate
+ a rdfs:Class ;
+ rdfs:subClassOf rdft:Test .
+
+<>
+ rdf:type mf:Manifest ;
+ rdfs:comment "Serd validation test cases" ;
+ mf:entries (
+ <#bad-all-values-from>
+ <#bad-cardinality-high>
+ <#bad-cardinality-low>
+ <#bad-cardinality>
+ <#bad-datatype-property>
+ <#bad-domain>
+ <#bad-functional-property>
+ <#bad-inverse-functional-property>
+ <#bad-literal-pattern>
+ <#bad-literal-value-high-inclusive>
+ <#bad-literal-value-low-inclusive>
+ <#bad-literal-value-high-exclusive>
+ <#bad-literal-value-low-exclusive>
+ <#bad-string-literal-value-high>
+ <#bad-string-literal-value-low>
+ <#bad-object-property>
+ <#bad-pattern>
+ <#bad-plain-literal>
+ <#bad-range-instance-not-literal>
+ <#bad-range-instance>
+ <#bad-range-literal-not-instance>
+ <#bad-range-literal>
+ <#bad-some-values-from>
+ <#bad-unknown-datatype>
+ <#bad-unknown-property>
+ ) .
+
+<#bad-all-values-from>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-all-values-from" ;
+ mf:action <bad-all-values-from.ttl> .
+
+<#bad-cardinality-low>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-cardinality-low" ;
+ mf:action <bad-cardinality-low.ttl> .
+
+<#bad-cardinality-high>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-cardinality-high" ;
+ mf:action <bad-cardinality-high.ttl> .
+
+<#bad-cardinality>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-cardinality" ;
+ mf:action <bad-cardinality.ttl> .
+
+<#bad-datatype-property>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-datatype-property" ;
+ mf:action <bad-datatype-property.ttl> .
+
+<#bad-domain>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-domain" ;
+ mf:action <bad-domain.ttl> .
+
+<#bad-functional-property>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-functional-property" ;
+ mf:action <bad-functional-property.ttl> .
+
+<#bad-inverse-functional-property>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-inverse-functional-property" ;
+ mf:action <bad-inverse-functional-property.ttl> .
+
+<#bad-literal-pattern>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-literal-pattern" ;
+ mf:action <bad-literal-pattern.ttl> .
+
+<#bad-literal-value-low-inclusive>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-literal-value-low-inclusive" ;
+ mf:action <bad-literal-value-low-inclusive.ttl> .
+
+<#bad-literal-value-high-inclusive>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-literal-value-high-inclusive" ;
+ mf:action <bad-literal-value-high-inclusive.ttl> .
+
+<#bad-literal-value-low-exclusive>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-literal-value-low-exclusive" ;
+ mf:action <bad-literal-value-low-exclusive.ttl> .
+
+<#bad-literal-value-high-exclusive>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-literal-value-high-exclusive" ;
+ mf:action <bad-literal-value-high-exclusive.ttl> .
+
+<#bad-string-literal-value-low>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-string-literal-value-low" ;
+ mf:action <bad-string-literal-value-low.ttl> .
+
+<#bad-string-literal-value-high>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-string-literal-value-high" ;
+ mf:action <bad-string-literal-value-high.ttl> .
+
+<#bad-object-property>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-object-property" ;
+ mf:action <bad-object-property.ttl> .
+
+<#bad-pattern>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-pattern" ;
+ mf:action <bad-pattern.ttl> .
+
+<#bad-plain-literal>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-plain-literal" ;
+ mf:action <bad-plain-literal.ttl> .
+
+<#bad-range-instance-not-literal>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-range-instance-not-literal" ;
+ mf:action <bad-range-instance-not-literal.ttl> .
+
+<#bad-range-instance>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-range-instance" ;
+ mf:action <bad-range-instance.ttl> .
+
+<#bad-range-literal-not-instance>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-range-literal-not-instance" ;
+ mf:action <bad-range-literal-not-instance.ttl> .
+
+<#bad-range-literal>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-range-literal" ;
+ mf:action <bad-range-literal.ttl> .
+
+<#bad-some-values-from>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-some-values-from" ;
+ mf:action <bad-some-values-from.ttl> .
+
+<#bad-unknown-datatype>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-unknown-datatype" ;
+ mf:action <bad-unknown-datatype.ttl> .
+
+<#bad-unknown-property>
+ rdf:type serd:TestTurtleNegativeValidate ;
+ mf:name "bad-unknown-property" ;
+ mf:action <bad-unknown-property.ttl> .
diff --git a/wscript b/wscript
index b1275535..6dfadcd5 100644
--- a/wscript
+++ b/wscript
@@ -185,17 +185,22 @@ def build(bld):
# Test programs
for prog in [('serdi_static', 'src/serdi.c'),
+ ('serd_validate_static', 'src/serd_validate.c'),
('serd_test', 'tests/serd_test.c'),
('read_chunk_test', 'tests/read_chunk_test.c'),
('nodes_test', 'tests/nodes_test.c'),
('overflow_test', 'tests/overflow_test.c'),
('model_test', 'tests/model_test.c')]:
- bld(features = 'c cprogram',
- source = prog[1],
- use = 'libserd_profiled',
- target = prog[0],
- defines = defines,
- **test_args)
+ obj = bld(features = 'c cprogram',
+ source = prog[1],
+ use = 'libserd_profiled',
+ target = prog[0],
+ defines = defines,
+ **test_args)
+ if prog[0] == 'serd_validate_static':
+ autowaf.use_lib(bld, obj, 'PCRE')
+ obj.cflags += bld.env.PTHREAD_CFLAGS
+ obj.linkflags += bld.env.PTHREAD_LINKFLAGS
bld(features = 'cxx cxxprogram',
source = 'tests/serd_cxx_test.cpp',
@@ -503,6 +508,27 @@ def test_suite(ctx, base_uri, testdir, report, isyntax, osyntax, options=''):
for i in test_types():
run_tests(i[0], i[1])
+def validation_test_suite(ctx, base_uri, testdir, isyntax, osyntax, options=''):
+ srcdir = ctx.path.abspath()
+ schemas = glob.glob(os.path.join(srcdir, 'schemas', '*.ttl'))
+
+ test_class = 'http://drobilla.net/ns/serd#TestTurtleNegativeValidate'
+ mf = 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#'
+ model = load_rdf(os.path.join(srcdir, 'tests', testdir, 'manifest.ttl'))
+ tests = get_resources_with_type(model, test_class)
+
+ with autowaf.begin_tests(ctx, APPNAME, 'validation'):
+ for (num, test) in enumerate(sorted(tests)):
+ action_node = model[test][mf + 'action'][0]
+ name = os.path.basename(action_node)
+ action = os.path.join('../tests', testdir, name)
+ abs_action = os.path.join(srcdir, action)
+ uri = base_uri + os.path.basename(action)
+ command = 'serd_validate_static %s %s' % (
+ ' '.join(schemas), action)
+
+ autowaf.run_test(ctx, APPNAME, command, 11, name=name)
+
def run_test_suites(ctx, opts):
"runs all manifest-driven test suites with the given serdi options"
@@ -582,7 +608,9 @@ def test(ctx):
'serdi_static -v > %s' % nul,
'serdi_static -h > %s' % nul,
'serdi_static -s "<foo> a <#Thingie> ." > %s' % nul,
- 'serdi_static %s > %s' % (nul, nul)
+ 'serdi_static %s > %s' % (nul, nul),
+ 'serd_validate_static -v > %s' % nul,
+ 'serd_validate_static -h > %s' % nul
], 0, name='GoodCommands')
autowaf.run_tests(ctx, APPNAME, [
@@ -600,7 +628,11 @@ def test(ctx):
'serdi_static -i illegal > %s' % nul,
'serdi_static -o illegal > %s' % nul,
'serdi_static -i turtle > %s' % nul,
- 'serdi_static /no/such/file > %s' % nul],
+ 'serdi_static /no/such/file > %s' % nul,
+ 'serd_validate_static > %s' % nul,
+ 'serd_validate_static -k > %s' % nul,
+ 'serd_validate_static -k -1 > %s' % nul,
+ 'serd_validate_static -q > %s' % nul],
1, name='BadCommands')
with autowaf.begin_tests(ctx, APPNAME, 'IoErrors'):
@@ -618,6 +650,15 @@ def test(ctx):
'serdi_static "file://%s/tests/good/manifest.ttl" > /dev/full' % srcdir,
1, name='write_error')
+ # Run serd validation test suite
+ with open('validation_earl.ttl', 'w') as report:
+ serd_base = 'http://drobilla.net/sw/serd/tests/'
+ report.write('@prefix earl: <http://www.w3.org/ns/earl#> .\n'
+ '@prefix dc: <http://purl.org/dc/elements/1.1/> .\n')
+ validation_test_suite(ctx, serd_base + 'validate/', 'validate',
+ None, 'Turtle', 'NTriples')
+
+ # Run data-driven test suites
for opts in ['', '-m']:
run_test_suites(ctx, opts)