diff --git a/readme.md b/readme.md index cc3bca8..6db3fcc 100644 --- a/readme.md +++ b/readme.md @@ -1,22 +1,66 @@ -# shaclgen -shaclgen generates shacl templates based on the properties and classes present in a graph. This module uses the rdflib library for working with rdf. +SHACLGEN +======== +Shaclgen takes either a data graph(s) or schema(s) as input and +generates a basic shape file based on the classes and properties +present. +**Shape files from data graphs:** By default, the input graph is +processed as a data graph (instance triples). Three formats are possible +for data graphs: simple, nested, and extended. -### From the command line: -``` -$ shaclgen [uri to data] [serialization] -``` +- Simple: Each class and property generate individual Node- and + PropertyShapes. +- Nested: Property shapes will be nested in nodeshapes iif they occur + with one class. +- Extended: Expands nested shapes to create individual property shapes + for each property, in addition to nesting them when appropriate. -Supported serializations include: -- `ttl` for turtle -- `xml` for rdf/xml -- `nt` for ntriples +**Shape files from ontologies:** If the input is a schema or ontology, +shaclgen generates a nested shape file: properties with rdfs:domain +defined in the ontology will be nested within the appropriate NodeShape. +rdfs:range definitions for XML and rdfs datatypes are included. -example: -``` -$shaclgen https://www.lib.washington.edu/static/public/cams/data/datasets/uwSemWebParts/aggregation-1-0-0.ttl ttl -``` -This project is still in development. Comments, questions, and issues are welcome! +Added support for OWL constructions is planned. + +* * * * * + +Installation +------------ + +Using pip: : + + pip install shaclgen + +From source: + + + +Command line use: +----------------- + + $ shaclgen graph [optional arguments] + +Example usage: : + + $ shaclgen https://www.lib.washington.edu/static/public/cams/data/datasets/uwSemWebParts/webResource-1-0-0.nt + +Command line arguments: : + + positional arguments: + graph The data graph(s). + + optional arguments: + -h, --help show this help message and exit + -nf, --nested generates a nested shape file + -ef, --extended generates an expanded shape file + -o, --ontology input file(s) or URL(s) is a schema or ontology + -s SERIALIZATION, --serialization SERIALIZATION + result graph serialization, default is turtle + +* * * * * + +This project is still in development. Comments, questions, and issues +are welcome! Contact alexiskm at uw dot edu. diff --git a/shaclgen/schema.py b/shaclgen/schema.py index 40ff239..e09a8e1 100644 --- a/shaclgen/schema.py +++ b/shaclgen/schema.py @@ -168,19 +168,19 @@ def gen_graph(self, serial='turtle'): ng.add((blank, SH.datatype, rang)) else: ng.add((blank, SH['class'], rang )) - for r in self.REST.keys(): - if self.REST[r]['onProp'] == p and self.REST[r]['onClass'] == self.PROPS[p]['domain']: - if self.REST[r]['type'] in (OWL.cardinality): - ng.add((blank, SH.minCount, Literal(self.REST[r]['value'], datatype=XSD.integer))) - ng.add((blank, SH.maxCount, Literal(self.REST[r]['value'], datatype=XSD.integer))) - elif self.REST[r]['type'] in (OWL.minCardinality): - ng.add((blank, SH.minCount, Literal(self.REST[r]['value'], datatype=XSD.integer))) - elif self.REST[r]['type'] in (OWL.maxCardinality): - ng.add((blank, SH.maxCount, Literal(self.REST[r]['value'], datatype=XSD.integer))) - else: - pass - else: - pass +# for r in self.REST.keys(): +# if self.REST[r]['onProp'] == p and self.REST[r]['onClass'] == self.PROPS[p]['domain']: +# if self.REST[r]['type'] in (OWL.cardinality): +# ng.add((blank, SH.minCount, Literal(self.REST[r]['value'], datatype=XSD.integer))) +# ng.add((blank, SH.maxCount, Literal(self.REST[r]['value'], datatype=XSD.integer))) +# elif self.REST[r]['type'] in (OWL.minCardinality): +# ng.add((blank, SH.minCount, Literal(self.REST[r]['value'], datatype=XSD.integer))) +# elif self.REST[r]['type'] in (OWL.maxCardinality): +# ng.add((blank, SH.maxCount, Literal(self.REST[r]['value'], datatype=XSD.integer))) +# else: +# pass +# else: +# pass else: label = self.PROPS[p]['label'] ng.add((EX[label], RDF.type, SH.NodeShape))