From dc88be9730ecbb30b18d7f7d8e7b6e1234557d4b Mon Sep 17 00:00:00 2001 From: Eric Douglass Date: Thu, 12 Nov 2020 13:08:41 -0800 Subject: [PATCH 1/4] schema for rule report providers and a document showing how the reporting procedure should work --- metadata/example.report.json | 27 ++++++++++ metadata/report.schema.json | 98 ++++++++++++++++++++++++++++++++++++ reporting/README.md | 37 ++++++++++++++ 3 files changed, 162 insertions(+) create mode 100644 metadata/example.report.json create mode 100644 metadata/report.schema.json create mode 100644 reporting/README.md diff --git a/metadata/example.report.json b/metadata/example.report.json new file mode 100644 index 00000000..14237ac9 --- /dev/null +++ b/metadata/example.report.json @@ -0,0 +1,27 @@ + +{ + "entities": 2, + "errors": 0, + "valid-entities": 2, + "groupable-keys": [ + { + "key":"taxon", + "default": "taxon:0" + }, + { + "key": "group", + "default": "unknown" + } + ], + "messages": { + "gorule-0000001": [ + { + "level": "WARNING", + "entity": "I'm\ta\tGAF\tline", + "type": "Violates GO Rule", + "message": "This is an error message", + "rule": 3 + } + ] + } +} diff --git a/metadata/report.schema.json b/metadata/report.schema.json new file mode 100644 index 00000000..04600868 --- /dev/null +++ b/metadata/report.schema.json @@ -0,0 +1,98 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + + "definitions": { + "rule-message": { + "$comment": "Contents of a rule", + "type": "object", + "properties": { + "level": { + "type": "string", + "enum": ["PASS", "WARNING", "ERROR"] + }, + "entity": { + "type": "string", + "$comment": "This is the entity being reported on. Whether it's a GAF line or model ID." + }, + "type": { + "type": "string", + "$comment": "Usually should say 'Violates GO Rule', unless it's directly some kind of parse error" + }, + "message": { + "type": "string", + "$comment": "Whatever extra message about the nature of the error in the validation source" + }, + "obj": { + "type": "string", + "default": "", + "$comment": "Optional. If available, this should be the part of the `entity` that failed." + }, + "rule": { + "type": "integer", + "minimum": 1, + "maximum": 9999999, + "$comment": "This is not strictly necessary given the provided information, and the rule for a message should be calculable given what rule ID key it's in. This should not be required in the future" + } + }, + "required": ["level", "entity", "type", "message", "rule"] + }, + + "messages-group": { + "type": "object", + "patternProperties": { + "^gorule-[0-9]{6}[1-9]$": { + "oneOf": [ + { + "type": "string", + "enum": ["skipped"] + }, + { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/rule-message" + } + } + ] + } + }, + "additionalProperties": false + } + }, + + "type": "object", + "properties": { + "messages": { + "type": "object", + "$ref": "#/definitions/messages-group" + }, + "entities": { + "type": "integer", + "minimum": 0 + }, + "errors": { + "type": "integer", + "minimum": 0 + }, + "valid-entities": { + "type": "integer", + "minimum": 0 + }, + "groupable-keys": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "default": { + "type": "string" + } + } + } + } + }, + + "required": ["messages", "entities", "errors", "valid-entities", "groupable-keys"] +} diff --git a/reporting/README.md b/reporting/README.md new file mode 100644 index 00000000..e0829f5c --- /dev/null +++ b/reporting/README.md @@ -0,0 +1,37 @@ +# Rule Reports + +Reports from Rules will use the JSON schema at [go-site/metadata/report.schema.json](../metadata/report.schema.json). + +## Generating Rule Report Grid Page + +To generate a reports page like at http://snapshot.geneontology.org/reports/gorule-report.html we need: +1. The collection of reports of GO Rule violations +2. A property to "group" the reports by (by default it's `dataset`, like `mgi` or `genedb_lmajor`). This is the set of horizontal headers along the grid. Reports MUST provide a default value in case a Message does not have value +3. Preferably a mapping of whatever value of grouping key above and a URL where we can find that link. For example for the current gorule-report page, we have: `dataset` ->`{base}/reports/{dataset}-report.html#rmd`. +4. Preferably a link to where we can find the specific violations for `(rule-id, grouping-key)`. For example in for teh current gorule-report page, we have: `{base}/reports/{dataset}-report.html#{rule-id}`. + +This gets us to the gorule-reports.html page, like we have already. + +## Expansions + +Consider this section more proposal than requirements at this stage. + +In our current setup, we generate outselves the JSON and the MD versions of the report. The Markdown versions are then rendered into HTML and joined with other HTML pages in the reports directory on skyhook/snapshot/et al. Since the process (ontobio) that produces both the JSON and the Markdown reports are the same -- *in this case* -- we can guarantee that what we want to see in the Markdown -> HTML is representative of the JSON. In Ontobio case, the MD report is created *from* the JSON report. + +In this vein, I could foresee a way to generically produce a static HTML page of the reports like we see for a `dataset` or a specific rule now (see http://snapshot.geneontology.org/reports/fb-report.html#rmd for example) using just the report JSON, and not rely on the pre-existence of the MD -> HTML page. + +This could look like a lot of things, but the basics of the layout is that only the individual error messages need be different for different error providers. For example the Shex reports have more data in each message, and that's good! + +If a report provider also supplied a property called, say, `message-template` that conformed to the schema: +``` +{ + "type": String, +} +``` + +And provided some template using the values of the keys in the given message, we could produce the MD/HTML page ourselves directly in the report handling procedures. + +For example, our existing message could be templated as: +``` +"{level} - {type}: {message} -- {line}" +``` From 821046d472e5495765e937df93319ac23640868c Mon Sep 17 00:00:00 2001 From: Eric Douglass Date: Wed, 18 Nov 2020 13:34:44 -0800 Subject: [PATCH 2/4] minerva shex report output schema and markdown docs + proposal --- metadata/report.schema.json | 22 +- metadata/shex-report.schema.json | 291 ++++ reporting/README.md | 32 + reporting/gorules_report.json | 2648 ++++++++++++++++++++++++++++++ 4 files changed, 2992 insertions(+), 1 deletion(-) create mode 100644 metadata/shex-report.schema.json create mode 100644 reporting/gorules_report.json diff --git a/metadata/report.schema.json b/metadata/report.schema.json index 04600868..542b3cce 100644 --- a/metadata/report.schema.json +++ b/metadata/report.schema.json @@ -91,8 +91,28 @@ } } } + }, + "entity-type": { + "type": "string" + }, + "message-template": { + "type": "string" + }, + "report-group-urls": { + "type": "object", + "properties": { + "group-url": { + "type": "string", + "format": "uri-template" + }, + "group-rule-url": { + "$comment": "Can use like: `{base}/reports/{group}#{ruleid}`", + "type": "string", + "format": "uri-template" + } + } } }, - "required": ["messages", "entities", "errors", "valid-entities", "groupable-keys"] + "required": ["messages", "entities", "errors", "valid-entities", "groupable-keys", "entity-type"] } diff --git a/metadata/shex-report.schema.json b/metadata/shex-report.schema.json new file mode 100644 index 00000000..40eae4e9 --- /dev/null +++ b/metadata/shex-report.schema.json @@ -0,0 +1,291 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Shex Minerva Report schema, as of Nov 2020", + "$comment": "This is the descriptive schema for the Minerva Shex report output, and not aspirational. See https://github.com/geneontology/minerva/pull/359. This will be a seperate schema from the standard rule reports for the time being, until we can make a higher order schema lifting both into one format and reporting system.", + + "definitions": { + "rule-message": { + "$comment": "Contents of a rule", + "type": "object", + "properties": { + "level": { + "type": "string", + "enum": ["PASS", "WARNING", "ERROR"] + }, + "model-id": { + "$ref": "#/definitions/gomodel-id", + "$comment": "This is a CURIE, with `gomodel` being the namespace. This is the ID for the noctua model being tested with Shex." + }, + "type": { + "type": "string", + "$comment": "Usually should say 'Violates GO Rule', unless it's directly some kind of parse error" + }, + "message": { + "type": "string", + "$comment": "Whatever string message about the nature of the error in the validation source" + }, + "taxa": { + "type": "array", + "items": { + "$ref": "#/definitions/taxon-id" + } + }, + "obj": { + "type": "string", + "default": "", + "$comment": "Optional. If available, this should be the part of the `entity` that failed." + }, + "rule": { + "type": "integer", + "minimum": 1, + "maximum": 9999999 + }, + "explanations": { + "$ref": "#/definitions/explanations" + } + }, + + "required": ["level", "model-id", "type", "message", "rule"] + }, + + "explanations-item": { + "type": "object", + "properties": { + "shape": { + "$ref": "#/definitions/shape-id" + }, + "constraints": { + "type": "array", + "$comment": "Set of shape constraints violated for the `shape`, and `node`", + "item": { + "$ref": "#/definitions/constraints-item" + } + } + }, + "required": ["shape", "constraints"] + }, + + "constraints-item": { + "type": "object", + "$comment": "The basic form here is that we have an RDF triple of instances that are in violation of the shex. Higher up, in the `explanations` object, the `node` key is the Subject, the Predicate is `property`, and `object` is the Object, making (Subject, Predicate, Object). So `node_types` are the classes that Subject is an instance of, and `object_types` are the classes that Object is an instance of. In a range failure -- where we have a mismatch of expected range from the Predicate and the class of the Subject/Object -- the fields `matched_range_shapes` and `intended-range-shapes` will exist, showing what the shape expeted the triple to be, and what it foudn instead. For a cardinality failure the `nobjects` represents the number of objects that follow the given Subject, Predicate, and how it failed to be in the range specified in the `cardinality` field.", + + "oneOf": [ + { "$ref": "#/definitions/range-constraint-violation"}, + { "$ref": "#/definitions/cardinality-constraint-violation"} + ] + }, + + "range-constraint-violation": { + "type": "object", + "properties": { + "object": { + "$ref": "#/definitions/gomodel-id", + "$comment": "The RDF object node that failed the shape validation" + }, + "property": { + "$ref": "#/definitions/curie", + "$comment": "The RDF property pointing at the `object`" + }, + "node_types": { + "$comment": "Classes that the Subject RDF is an instance of", + "item": { + "$ref": "#/definitions/curie" + } + }, + "object_types": { + "$comment": "Classes that the Object RDF is an instance of", + "item": { + "$ref": "#/definitions/curie" + } + }, + "nobjects": { + "type": "integer" + }, + "matched_range_shapes": { + "type": "array", + "$comment": "The set of shapes the shex validator found when looking at this property and object", + "item": { + "$ref": "#/definitions/shape-id" + } + }, + "intended-range-shapes": { + "type": "array", + "$comment": "The set of shapes the shex validator was expecting due to the range of the `property` field. This will be `owl:Nothing` if the property does not belong on the Subject `node` in the first place.", + "item": { + "$ref": "#/definitions/shape-id" + } + } + }, + "required": ["object", "property", "node_types", "object_types", "nobjects", "matched_range_shapes", "intended-range-shapes"] + }, + + "cardinality-constraint-violation": { + "type": "object", + "properties": { + "property": { + "$ref": "#/definitions/curie" + }, + "cardinality": { + "type": "string", + "pattern": "^\\[([0-9]+|\\*);[\\s]*([0-9]+|\\*)\\]$" + }, + "nobjects": { + "type": "integer" + } + }, + "required": ["property", "cardinality", "nobjects"] + }, + + "gomodel-id": { + "type": "string", + "pattern": "^gomodel:[a-zA-Z0-9][a-zA-Z0-9/_-]*$" + }, + + "taxon-id": { + "type": "string", + "pattern": "^((NCBITaxon)|(taxon)):[0-9]+$" + }, + + "shape-id": { + "type": "string", + "pattern": "^[a-z]+:[a-zA-Z_][a-zA-Z0-9/_]*$" + }, + + "curie": { + "type": "string", + "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*:\\w[\\w_-]*$" + }, + + "explanations": { + "type": "object", + "properties": { + "is-conformant": { + "type": "boolean", + "$comment": "If this is false, then either it was owl validation failure or shex validation failure" + }, + "owl-validation": { + "type": "object", + "$comment": "Info about owl validation failures", + "properties": { + "id": { + "type": "string", + "$comment": "Is this the reasoner used?" + }, + "is-conformant": { + "type": "boolean", + "$comment": "If the the model is inconsistent, this is false" + }, + "tracker": { + "type": "string", + "format": "uri", + "$comment": "geneontology helpdesk issue URL" + }, + "rule-file": { + "type": "string", + "format": "uri", + "$comment": "github go-ontolgoy URL" + }, + "violations": { + "type": "array", + "item": { + "type": "object", + "properties": { + "node": { + "type": "string", + "$comment": "TODO should this be a URI?" + } + } + } + } + }, + "required": ["id", "is-conformant", "tracker", "rule-file"] + }, + "shex-validation": { + "type": "object", + "node-matched-shapes": { + "type": "object", + "$comment": "TODO This is empty currently" + }, + "is-conformant": { + "type": "boolean", + "$comment": "False if the model doesn't conform to the shex" + }, + "tracker": { + "type": "string", + "format": "uri", + "$comment": "go-shapes github issue URL" + }, + "rule-file": { + "type": "string", + "format": "uri", + "$comment": "URL to shex shape file" + }, + "violations": { + "type": "array", + "item": { + "type": "object", + "properties": { + "explanations": { + "type": "array", + "item": { + "$ref": "#/definitions/explanations-item" + } + }, + "node": { + "$ref": "#/definitions/gomodel-id" + } + }, + "required": ["explanations", "node"] + } + } + } + } + }, + + "messages-group": { + "type": "object", + "patternProperties": { + "^gorule-[0-9]{6}[1-9]$": { + "oneOf": [ + { + "type": "string", + "enum": ["skipped"] + }, + { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/rule-message" + } + } + ] + } + }, + "additionalProperties": false + } + }, + + "type": "object", + "properties": { + "taxa": { + "type": "array" + }, + "messages": { + "type": "object", + "$ref": "#/definitions/messages-group" + }, + "number_of_models": { + "type": "integer", + "minimum": 0 + }, + "number_of_models_in_error": { + "type": "integer", + "minimum": 0 + }, + "number_of_correct_models": { + "type": "integer", + "minimum": 0 + } + }, + "required": ["messages", "taxa", "number_of_models", "number_of_models_in_error", "number_of_correct_models"] +} diff --git a/reporting/README.md b/reporting/README.md index e0829f5c..458dbbea 100644 --- a/reporting/README.md +++ b/reporting/README.md @@ -35,3 +35,35 @@ For example, our existing message could be templated as: ``` "{level} - {type}: {message} -- {line}" ``` + +But this could be more sophisticated too. + +## Reporting Process + +Given: +1. A collection of report JSON files +2. Path to GO Rules specs +3. Mapping of `{grouping-key} -> (group-URL, group-rule-URL)` where `group-URL` is a URL that points to the messages in that group key, and `group-rule-URL` is a URL that points to a the collection of messages in that group corresponding to that GO Rule. + * (The above URLs could be in the report itself, in `report-url`) + * The URL could be templated. Use `{base}` at the beginning of a URL to make a relative path + * Use `{group}` for substituting the value of the `{grouping-key}` + * Use `{ruleid}` for substituting the value of the GO Rule ID + * Should conform to [RFC6570](https://tools.ietf.org/html/rfc6570), and variables are assumed to be in the level 2 template. + * Examples: + * `https://example.com/reports/{group}` + * `https://example.com/reports/{group}#{ruleid}` + * `{base}/reports/{group}#{ruleid}` + + +### Process + +1. Normalize all given messages by Rule + * The normalize occurs by placing keys and their values that occur in the top level of the report that are beyond the required keys into each Message seen for the given report. + * For example, the existing reports have `group` and `dataset` and keys. For `"group": "mgi"`, we would place `"group": "mgi"` in each Message object, along with `group`, or any other key. + * The `rule` value will be replaced with the full ID it appears in. + * Messages from other reports have their messages normalized in this way, and then messages within each rule can be added from multiple files. +2. We can now easily merge all given report JSON together. +3. Produce the grid data with the total Merged data that will be placed into the HTML template. + * We could also produce an HTML template for each `grouping-key` item. +4. *Do we produce a templated HTML for each `entity-type`?* +5. For the more expanded, advanced proposal, we can generate a `{grouping-key}.report.md` file as a human-readable report using the `message-template` in the report. The produced templated HTML can now link to those produced report files. diff --git a/reporting/gorules_report.json b/reporting/gorules_report.json new file mode 100644 index 00000000..3e9e651c --- /dev/null +++ b/reporting/gorules_report.json @@ -0,0 +1,2648 @@ +{ + "taxa": [], + "number_of_models": 50, + "number_of_models_in_error": 31, + "number_of_correct_models": 19, + "messages": { + "gorule-0000019": [ + { + "level": "ERROR", + "model-id": "gomodel:5d27d1cf00000154", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000019: Model is logically inconsistent", + "rule": 19 + }, + { + "level": "ERROR", + "model-id": "gomodel:5d27d1cf00000311", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000019: Model is logically inconsistent", + "rule": 19 + }, + { + "level": "ERROR", + "model-id": "gomodel:5d27d1cf00000368", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000019: Model is logically inconsistent", + "rule": 19 + }, + { + "level": "ERROR", + "model-id": "gomodel:5d27d1cf00000173", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000019: Model is logically inconsistent", + "rule": 19 + }, + { + "level": "ERROR", + "model-id": "gomodel:59dc728000000512", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000019: Model is logically inconsistent", + "rule": 19 + }, + { + "level": "ERROR", + "model-id": "gomodel:5d27d1cf00000250", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000019: Model is logically inconsistent", + "rule": 19 + }, + { + "level": "ERROR", + "model-id": "gomodel:5b528b1100000186", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000019: Model is logically inconsistent", + "rule": 19 + }, + { + "level": "ERROR", + "model-id": "gomodel:5d27d1cf00000484", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000019: Model is logically inconsistent", + "rule": 19 + }, + { + "level": "ERROR", + "model-id": "gomodel:5d27d1cf00000078", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000019: Model is logically inconsistent", + "rule": 19 + }, + { + "level": "ERROR", + "model-id": "gomodel:5d27d1cf00000330", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000019: Model is logically inconsistent", + "rule": 19 + }, + { + "level": "ERROR", + "model-id": "gomodel:5d27d1cf00000231", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000019: Model is logically inconsistent", + "rule": 19 + }, + { + "level": "ERROR", + "model-id": "gomodel:5d27d1cf00000387", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000019: Model is logically inconsistent", + "rule": 19 + }, + { + "level": "ERROR", + "model-id": "gomodel:5d27d1cf00000135", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000019: Model is logically inconsistent", + "rule": 19 + }, + { + "level": "ERROR", + "model-id": "gomodel:5d27d1cf00000116", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000019: Model is logically inconsistent", + "rule": 19 + }, + { + "level": "ERROR", + "model-id": "gomodel:59dc728000000513", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000019: Model is logically inconsistent", + "rule": 19 + }, + { + "level": "ERROR", + "model-id": "gomodel:5d27d1cf00000464", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000019: Model is logically inconsistent", + "rule": 19 + } + ], + "gorule-0000056": [ + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000135", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": false, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology", + "violations": [ + { + "node": "id of inconsistent node" + } + ] + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000135/5d27d1cf00000153", + "property": "BFO:0000066", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "GO:0006261" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/BiologicalProcess", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/AnatomicalEntity" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000135/5d27d1cf00000143" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000311", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": false, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology", + "violations": [ + { + "node": "id of inconsistent node" + } + ] + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000311/5d27d1cf00000321", + "property": "RO:0002234", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "CHEBI:75962" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + }, + { + "object": "gomodel:5d27d1cf00000311/5d27d1cf00000329", + "property": "RO:0002233", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "GO:0006260" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/BiologicalProcess", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000311/5d27d1cf00000319" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:59dc728000000512", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": false, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology", + "violations": [ + { + "node": "id of inconsistent node" + } + ] + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:59dc728000000512/5ce58dde00002086", + "property": "BFO:0000050", + "node_types": [ + "GO:0016874" + ], + "object_types": [ + "GO:0005829" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/AnatomicalEntity", + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity", + "obo:go/shapes/CellularComponent" + ], + "intended-range-shapes": [ + "obo:go/shapes/BiologicalProcess" + ] + } + ] + } + ], + "node": "gomodel:59dc728000000512/59dc728000000520" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000349", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": true, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology" + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000349/5d27d1cf00000367", + "property": "RO:0002413", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "GO:0006261" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/BiologicalProcess", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/MolecularFunction", + "obo:go/shapes/MolecularEvent" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000349/5d27d1cf00000357" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000097", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": true, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology" + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000097/5d27d1cf00000107", + "property": "RO:0002234", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "CHEBI:75962" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + }, + { + "object": "gomodel:5d27d1cf00000097/5d27d1cf00000115", + "property": "BFO:0000066", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "GO:0043853" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/ProteinContainingComplex", + "obo:go/shapes/GoCamEntity", + "obo:go/shapes/CellularComponent" + ], + "intended-range-shapes": [ + "obo:go/shapes/AnatomicalEntity" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000097/5d27d1cf00000105" + }, + { + "explanations": [ + { + "shape": "obo:go/shapes/GoCamModel", + "constraints": [ + { + "property": "dc11:title", + "cardinality": "[1; 1]", + "nobjects": 0 + }, + { + "object": "owl:Ontology", + "property": "rdf:type", + "node_types": [ + "owl:Ontology" + ], + "object_types": [], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "owl:Ontology" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000097" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000173", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": false, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology", + "violations": [ + { + "node": "id of inconsistent node" + } + ] + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000173/5d27d1cf00000191", + "property": "RO:0002411", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "GO:0005634" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/AnatomicalEntity", + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity", + "obo:go/shapes/CellularComponent" + ], + "intended-range-shapes": [ + "obo:go/shapes/BiologicalProcess", + "obo:go/shapes/MolecularFunction", + "obo:go/shapes/MolecularEvent" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000173/5d27d1cf00000181" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:R-HSA-5660668", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": true, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology" + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:R-HSA-5660668/R-HSA-202461_R-HSA-5660665", + "property": "RO:0002233", + "node_types": [ + "GO:0005488" + ], + "object_types": [ + "gomodel:R-HSA-202461" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + }, + { + "object": "gomodel:R-HSA-5660668/R-HSA-5660651_R-HSA-5660665", + "property": "RO:0002233", + "node_types": [ + "GO:0005488" + ], + "object_types": [ + "gomodel:R-HSA-5660651" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + }, + { + "object": "gomodel:R-HSA-5660668/R-HSA-5660654_R-HSA-5660665", + "property": "RO:0002234", + "node_types": [ + "GO:0005488" + ], + "object_types": [ + "gomodel:R-HSA-5660654" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + } + ] + } + ], + "node": "gomodel:R-HSA-5660668/R-HSA-5660665" + }, + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:R-HSA-5660668/R-HSA-194047_R-HSA-5660622_controller", + "property": "RO:0002233", + "node_types": [ + "GO:0005488" + ], + "object_types": [ + "gomodel:R-HSA-194047" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + }, + { + "object": "gomodel:R-HSA-5660668/R-HSA-5660622", + "property": "RO:0002213", + "node_types": [ + "GO:0005488" + ], + "object_types": [], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/MolecularFunction", + "obo:go/shapes/MolecularEvent" + ] + } + ] + } + ], + "node": "gomodel:R-HSA-5660668/07239d56-e211-4e98-bdce-1812f7e69a2b" + }, + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:R-HSA-5660668/R-HSA-5660653_R-HSA-5660662", + "property": "RO:0002234", + "node_types": [ + "GO:0005488" + ], + "object_types": [ + "gomodel:R-HSA-5660653" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + }, + { + "object": "gomodel:R-HSA-5660668/R-HSA-561191_R-HSA-5660662", + "property": "RO:0002233", + "node_types": [ + "GO:0005488" + ], + "object_types": [ + "gomodel:R-HSA-561191" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + }, + { + "object": "gomodel:R-HSA-5660668/R-HSA-5660654_R-HSA-5660662", + "property": "RO:0002233", + "node_types": [ + "GO:0005488" + ], + "object_types": [ + "gomodel:R-HSA-5660654" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + } + ] + } + ], + "node": "gomodel:R-HSA-5660668/R-HSA-5660662" + }, + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:R-HSA-5660668/R-HSA-448689_R-HSA-5660663", + "property": "RO:0002233", + "node_types": [ + "GO:0004197" + ], + "object_types": [ + "gomodel:R-HSA-448689" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + }, + { + "object": "gomodel:R-HSA-5660668/R-HSA-449030_R-HSA-5660663", + "property": "RO:0002234", + "node_types": [ + "GO:0004197" + ], + "object_types": [ + "gomodel:R-HSA-449030" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + }, + { + "object": "gomodel:R-HSA-5660668/26d1cd45-2aa3-4bd5-a067-4592a157ffdb", + "property": "RO:0002333", + "node_types": [ + "GO:0004197" + ], + "object_types": [ + "gomodel:R-HSA-5660651" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ProteinContainingComplex", + "obo:go/shapes/InformationBiomacromolecule" + ] + }, + { + "object": "gomodel:R-HSA-5660668/R-HSA-449046_R-HSA-5660663", + "property": "RO:0002234", + "node_types": [ + "GO:0004197" + ], + "object_types": [ + "gomodel:R-HSA-449046" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + } + ] + } + ], + "node": "gomodel:R-HSA-5660668/R-HSA-5660663" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000647", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": true, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology" + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000647/5d27d1cf00000657", + "property": "RO:0002234", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "CHEBI:75962" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000647/5d27d1cf00000655" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000116", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": false, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology", + "violations": [ + { + "node": "id of inconsistent node" + } + ] + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000116/5d27d1cf00000134", + "property": "RO:0002333", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "GO:0006261" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/BiologicalProcess", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ProteinContainingComplex", + "obo:go/shapes/InformationBiomacromolecule" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000116/5d27d1cf00000124" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000368", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": false, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology", + "violations": [ + { + "node": "id of inconsistent node" + } + ] + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000368/5d27d1cf00000370", + "property": "RO:0002413", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "GO:0005634" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/AnatomicalEntity", + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity", + "obo:go/shapes/CellularComponent" + ], + "intended-range-shapes": [ + "obo:go/shapes/MolecularFunction", + "obo:go/shapes/MolecularEvent" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000368/5d27d1cf00000378" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000569", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": true, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology" + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000569/5d27d1cf00000579", + "property": "RO:0002234", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "CHEBI:75962" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + }, + { + "property": "BFO:0000066", + "cardinality": "[0; 1]", + "nobjects": 2 + } + ] + } + ], + "node": "gomodel:5d27d1cf00000569/5d27d1cf00000577" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000550", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": true, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology" + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "property": "BFO:0000050", + "cardinality": "[0; 1]", + "nobjects": 2 + }, + { + "object": "gomodel:5d27d1cf00000550/5d27d1cf00000560", + "property": "RO:0002234", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "CHEBI:75962" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000550/5d27d1cf00000558" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000288", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": true, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology" + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000288/5d27d1cf00000294", + "property": "RO:0002234", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "CHEBI:75962" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000288/5d27d1cf00000296" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000056", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": true, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology" + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/ProteinContainingComplex", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000056/5d27d1cf00000076", + "property": "BFO:0000051", + "node_types": [ + "GO:0032991" + ], + "object_types": [ + "CHEBI:15414" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ProteinContainingComplex", + "obo:go/shapes/InformationBiomacromolecule" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000056/5d27d1cf00000075" + }, + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000056/5d27d1cf00000075", + "property": "RO:0002333", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "GO:0032991" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity", + "obo:go/shapes/CellularComponent" + ], + "intended-range-shapes": [ + "obo:go/shapes/ProteinContainingComplex", + "obo:go/shapes/InformationBiomacromolecule" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000056/5d27d1cf00000064" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000330", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": false, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology", + "violations": [ + { + "node": "id of inconsistent node" + } + ] + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000330/5d27d1cf00000348", + "property": "RO:0002233", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "GO:0003713" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/MolecularFunction", + "obo:go/shapes/MolecularEvent", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + }, + { + "object": "gomodel:5d27d1cf00000330/5d27d1cf00000340", + "property": "RO:0002234", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "CHEBI:75962" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000330/5d27d1cf00000338" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000154", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": false, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology", + "violations": [ + { + "node": "id of inconsistent node" + } + ] + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000154/5d27d1cf00000172", + "property": "BFO:0000050", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "WB:WBGene00011345", + "CHEBI:33695" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/InformationBiomacromolecule", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/BiologicalProcess" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000154/5d27d1cf00000162" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000509", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": true, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology" + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000509/5d27d1cf00000513", + "property": "RO:0002234", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "CHEBI:75962" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + }, + { + "object": "gomodel:5d27d1cf00000509/5d27d1cf00000530", + "property": "RO:0002092", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "GO:0003887" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/MolecularFunction", + "obo:go/shapes/MolecularEvent", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/PlantStructureDevelopmentStage", + "obo:go/shapes/BiologicalPhase", + "obo:go/shapes/LifeCycleStage" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000509/5d27d1cf00000524" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000444", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": true, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology" + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000444/5d27d1cf00000445", + "property": "RO:0002234", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "CHEBI:75962" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + }, + { + "object": "gomodel:5d27d1cf00000444/5d29218800000055", + "property": "RO:0002092", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "GO:0006352" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/BiologicalProcess", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/PlantStructureDevelopmentStage", + "obo:go/shapes/BiologicalPhase", + "obo:go/shapes/LifeCycleStage" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000444/5d27d1cf00000449" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000484", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": false, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology", + "violations": [ + { + "node": "id of inconsistent node" + } + ] + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000484/5d27d1cf00000498", + "property": "RO:0002234", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "CHEBI:75962" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + }, + { + "object": "gomodel:5d27d1cf00000484/5d27d1cf00000506", + "property": "RO:0002092", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "GO:0032991" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/ProteinContainingComplex", + "obo:go/shapes/GoCamEntity", + "obo:go/shapes/CellularComponent" + ], + "intended-range-shapes": [ + "obo:go/shapes/PlantStructureDevelopmentStage", + "obo:go/shapes/BiologicalPhase", + "obo:go/shapes/LifeCycleStage" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000484/5d27d1cf00000487" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000531", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": true, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology" + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000531/5d27d1cf00000541", + "property": "RO:0002234", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "CHEBI:75962" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + }, + { + "property": "RO:0002333", + "cardinality": "[0; 1]", + "nobjects": 2 + } + ] + } + ], + "node": "gomodel:5d27d1cf00000531/5d27d1cf00000539" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000387", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": false, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology", + "violations": [ + { + "node": "id of inconsistent node" + } + ] + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000387/5d27d1cf00000403", + "property": "RO:0002413", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "CHEBI:33695", + "WB:WBGene00001865" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/InformationBiomacromolecule", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/MolecularFunction", + "obo:go/shapes/MolecularEvent" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000387/5d27d1cf00000395" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000666", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": true, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology" + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000666/5d27d1cf00000678", + "property": "RO:0002234", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "CHEBI:75962" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000666/5d27d1cf00000680" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000231", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": false, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology", + "violations": [ + { + "node": "id of inconsistent node" + } + ] + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000231/5d27d1cf00000249", + "property": "RO:0002234", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "GO:0006261" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/BiologicalProcess", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000231/5d27d1cf00000239" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000078", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": false, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology", + "violations": [ + { + "node": "id of inconsistent node" + } + ] + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000078/5d27d1cf00000096", + "property": "BFO:0000066", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "GO:0001055" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/MolecularFunction", + "obo:go/shapes/MolecularEvent", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/AnatomicalEntity" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000078/5d27d1cf00000086" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:59dc728000000513", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": false, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology", + "violations": [ + { + "node": "id of inconsistent node" + } + ] + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/InformationBiomacromolecule", + "constraints": [ + { + "object": "http://model.geneontology.org/59dc728000000513/5ce58dde00000266", + "property": "BFO:0000066", + "node_types": [ + "CHEBI:36080", + "UniProtKB:Q13253" + ], + "object_types": [ + "GO:0005634" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/AnatomicalEntity", + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity", + "obo:go/shapes/CellularComponent" + ], + "intended-range-shapes": [ + "owl:Nothing" + ] + } + ] + } + ], + "node": "gomodel:59dc728000000513/59dc728000000521" + }, + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:59dc728000000513/5ce58dde00000266", + "property": "RO:0002333", + "node_types": [ + "GO:0016874" + ], + "object_types": [ + "GO:0005634" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/AnatomicalEntity", + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity", + "obo:go/shapes/CellularComponent" + ], + "intended-range-shapes": [ + "obo:go/shapes/ProteinContainingComplex", + "obo:go/shapes/InformationBiomacromolecule" + ] + } + ] + } + ], + "node": "gomodel:59dc728000000513/59dc728000000520" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000038", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": true, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology" + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/GoCamModel", + "constraints": [ + { + "property": "dc11:contributor", + "cardinality": "[1; *]", + "nobjects": 0 + }, + { + "object": "owl:Ontology", + "property": "rdf:type", + "node_types": [ + "owl:Ontology" + ], + "object_types": [], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "owl:Ontology" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000038" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5b528b1100000186", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": false, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology", + "violations": [ + { + "node": "id of inconsistent node" + } + ] + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "property": "BFO:0000050", + "cardinality": "[0; 1]", + "nobjects": 2 + } + ] + } + ], + "node": "gomodel:5b528b1100000186/5c4605cc00000669" + }, + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5b528b1100000186/5ce58dde00001444", + "property": "BFO:0000050", + "node_types": [ + "GO:0003972" + ], + "object_types": [ + "GO:2000767" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/BiologicalProcess" + ] + } + ] + } + ], + "node": "gomodel:5b528b1100000186/5ce58dde00001438" + }, + { + "explanations": [ + { + "shape": "obo:go/shapes/BiologicalProcess", + "constraints": [ + { + "object": "gomodel:5b528b1100000186/5c4605cc00000669", + "property": "RO:0002213", + "node_types": [ + "GO:2000767" + ], + "object_types": [ + "GO:0003700" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/MolecularEvent", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/BiologicalProcess" + ] + } + ] + } + ], + "node": "gomodel:5b528b1100000186/5ce58dde00001444" + }, + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5b528b1100000186/5b528b1100000304", + "property": "BFO:0000050", + "node_types": [ + "GO:0016887" + ], + "object_types": [ + "GO:0044183" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/MolecularFunction", + "obo:go/shapes/MolecularEvent", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/BiologicalProcess" + ] + } + ] + } + ], + "node": "gomodel:5b528b1100000186/5b528b1100000314" + }, + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "property": "BFO:0000050", + "cardinality": "[0; 1]", + "nobjects": 2 + } + ] + } + ], + "node": "gomodel:5b528b1100000186/5b528b1100000198" + }, + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5b528b1100000186/5b528b1100000320", + "property": "BFO:0000050", + "node_types": [ + "GO:0051082" + ], + "object_types": [ + "GO:0044183" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/MolecularFunction", + "obo:go/shapes/MolecularEvent", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/BiologicalProcess" + ] + } + ] + } + ], + "node": "gomodel:5b528b1100000186/5b528b1100000362" + }, + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "property": "BFO:0000050", + "cardinality": "[0; 1]", + "nobjects": 2 + } + ] + } + ], + "node": "gomodel:5b528b1100000186/5b91dbd100002136" + }, + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5b528b1100000186/5b528b1100000304", + "property": "BFO:0000050", + "node_types": [ + "GO:0051082" + ], + "object_types": [ + "GO:0044183" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/MolecularFunction", + "obo:go/shapes/MolecularEvent", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/BiologicalProcess" + ] + } + ] + } + ], + "node": "gomodel:5b528b1100000186/5b528b1100000311" + }, + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5b528b1100000186/5b528b1100000320", + "property": "BFO:0000050", + "node_types": [ + "GO:0016887" + ], + "object_types": [ + "GO:0044183" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/MolecularFunction", + "obo:go/shapes/MolecularEvent", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/BiologicalProcess" + ] + } + ] + } + ], + "node": "gomodel:5b528b1100000186/5b528b1100000358" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000250", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": false, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology", + "violations": [ + { + "node": "id of inconsistent node" + } + ] + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000250/5d27d1cf00000268", + "property": "RO:0002234", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "GO:0003714" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/MolecularFunction", + "obo:go/shapes/MolecularEvent", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000250/5d27d1cf00000258" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000464", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": false, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology", + "violations": [ + { + "node": "id of inconsistent node" + } + ] + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000464/5d27d1cf00000483", + "property": "RO:0002092", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "GO:0032390" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/ProteinContainingComplex", + "obo:go/shapes/GoCamEntity", + "obo:go/shapes/CellularComponent" + ], + "intended-range-shapes": [ + "obo:go/shapes/PlantStructureDevelopmentStage", + "obo:go/shapes/BiologicalPhase", + "obo:go/shapes/LifeCycleStage" + ] + }, + { + "object": "gomodel:5d27d1cf00000464/5d27d1cf00000474", + "property": "RO:0002234", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "CHEBI:75962" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000464/5d27d1cf00000471" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000627", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": true, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology" + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000627/5d27d1cf00000637", + "property": "RO:0002234", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "CHEBI:75962" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000627/5d27d1cf00000635" + } + ] + } + } + }, + { + "level": "WARNING", + "model-id": "gomodel:5d27d1cf00000269", + "type": "Violates GO Rule", + "obj": "", + "taxa": [], + "message": "GORULE:0000056: Model does not validate against shex schema", + "rule": 56, + "explanations": { + "is-conformant": false, + "owl-validation": { + "id": "OWL_REASONER", + "is-conformant": true, + "tracker": "https://github.com/geneontology/helpdesk/issues", + "rule-file": "https://github.com/geneontology/go-ontology" + }, + "shex-validation": { + "node-matched-shapes": {}, + "is-conformant": false, + "tracker": "https://github.com/geneontology/go-shapes/issues", + "rule-file": "https://github.com/geneontology/go-shapes/blob/master/shapes/go-cam-shapes.shex", + "violations": [ + { + "explanations": [ + { + "shape": "obo:go/shapes/MolecularFunction", + "constraints": [ + { + "object": "gomodel:5d27d1cf00000269/5d27d1cf00000279", + "property": "RO:0002234", + "node_types": [ + "GO:0009008" + ], + "object_types": [ + "CHEBI:75962" + ], + "nobjects": 0, + "matched_range_shapes": [ + "obo:go/shapes/ProvenanceAnnotated", + "obo:go/shapes/GoCamEntity" + ], + "intended-range-shapes": [ + "obo:go/shapes/ChemicalEntity", + "obo:go/shapes/ProteinContainingComplex" + ] + } + ] + } + ], + "node": "gomodel:5d27d1cf00000269/5d27d1cf00000277" + } + ] + } + } + } + ] + } +} From 2907253b4c232706b29de9a3d26a251d136ab355 Mon Sep 17 00:00:00 2001 From: Eric Douglass Date: Mon, 23 Nov 2020 13:36:00 -0800 Subject: [PATCH 3/4] moving and renaming examples and schemas. README work in progress --- .../draft-example.report.json | 0 .../shex_report-example.json | 0 ...rt.schema.json => draft-report.schema.json} | 0 reporting/README.md | 18 ++++++++++++++++++ 4 files changed, 18 insertions(+) rename metadata/example.report.json => documentation/draft-example.report.json (100%) rename reporting/gorules_report.json => documentation/shex_report-example.json (100%) rename metadata/{report.schema.json => draft-report.schema.json} (100%) diff --git a/metadata/example.report.json b/documentation/draft-example.report.json similarity index 100% rename from metadata/example.report.json rename to documentation/draft-example.report.json diff --git a/reporting/gorules_report.json b/documentation/shex_report-example.json similarity index 100% rename from reporting/gorules_report.json rename to documentation/shex_report-example.json diff --git a/metadata/report.schema.json b/metadata/draft-report.schema.json similarity index 100% rename from metadata/report.schema.json rename to metadata/draft-report.schema.json diff --git a/reporting/README.md b/reporting/README.md index 458dbbea..115a2319 100644 --- a/reporting/README.md +++ b/reporting/README.md @@ -2,6 +2,22 @@ Reports from Rules will use the JSON schema at [go-site/metadata/report.schema.json](../metadata/report.schema.json). +For the interoperability of all GO related groups who would like to make and display reports, we provide a standard report JSON schema and tools. + +## Current Usage + +Currently as a product of annotation validation in the GO pipeline we produce report JSON files for each dataset of annotations. These reports are focused on GO Rule violations. The validation process also produces markdown files with the same data as the JSON reports but intended for more human consumption. Markdown reports are fed through an HTML renderer and joined with other reports producing a static HTML page with human readable reports, featuring GO Rules. + +To make it easy for people to see a broader view of the rules we provide a GO Rules "grid" report, where we join all JSON reports, and make a table mapping (Rule, Dataset) to number of violations that dataset has for that rule. Links to the rule, the report page for the dataset, and the specific reports for the rule are all provided on the Rule Id, Dataset name header, and the cell with the number of violations respectively. + +## Generalizing Reports for Other GO report sources + +### Report JSON format + +The report JSON should have a corresponding schema that allows for a variety of sources and uses of reports. But if it's a GO report, it should all be in the same format, allowing for interoperability. A JSON schema should validate multiple types of reports. + +### HEllo + ## Generating Rule Report Grid Page To generate a reports page like at http://snapshot.geneontology.org/reports/gorule-report.html we need: @@ -38,6 +54,8 @@ For example, our existing message could be templated as: But this could be more sophisticated too. +*Make more of the docs based on use cases* + ## Reporting Process Given: From aedd63ab805b20132ef172121bb3234e96e84b8d Mon Sep 17 00:00:00 2001 From: Eric Douglass Date: Tue, 24 Nov 2020 14:49:57 -0800 Subject: [PATCH 4/4] Updating report README to include use cases, which are all independent features from each other --- documentation/draft-example.report.json | 4 +- reporting/README.md | 116 ++++++++++++++++++------ 2 files changed, 89 insertions(+), 31 deletions(-) diff --git a/documentation/draft-example.report.json b/documentation/draft-example.report.json index 14237ac9..b3a46cc2 100644 --- a/documentation/draft-example.report.json +++ b/documentation/draft-example.report.json @@ -13,6 +13,7 @@ "default": "unknown" } ], + "group": "rebels", "messages": { "gorule-0000001": [ { @@ -20,7 +21,8 @@ "entity": "I'm\ta\tGAF\tline", "type": "Violates GO Rule", "message": "This is an error message", - "rule": 3 + "rule": 1, + "taxon": "taxon:12345" } ] } diff --git a/reporting/README.md b/reporting/README.md index 115a2319..0b1f6262 100644 --- a/reporting/README.md +++ b/reporting/README.md @@ -10,53 +10,60 @@ Currently as a product of annotation validation in the GO pipeline we produce re To make it easy for people to see a broader view of the rules we provide a GO Rules "grid" report, where we join all JSON reports, and make a table mapping (Rule, Dataset) to number of violations that dataset has for that rule. Links to the rule, the report page for the dataset, and the specific reports for the rule are all provided on the Rule Id, Dataset name header, and the cell with the number of violations respectively. +Thinking ahead to some future, we could generalize the reporting rule system including a number of use-case. + +1. Single JSON format general enough to capture a variety of domains + * GAFs, GO-CAM models, etc +2. One central GO reporting python library to handle collection of reports, templates, etc, to be used by other groups creating reports for GO. +3. Ability to produce a "grid" view like the current [go-rules report page](http://snapshot.geneontology.org/reports/gorule-report.html) for different types of reports. +4. Beside `3)`, generalize the grid view by different columns. The grid view should be able to group reports by arbitrary keys in the message data, specified by the report JSON. +5. Dynamic, report provider driven rendering of underlying HTML/Markdown report pages. + * For example, in the report JSON, a message render template could be provided, and a Markdown/HTML page could be generated given the template and the report JSON. + * Gives us the ability to create and link to any report dynamically. + ## Generalizing Reports for Other GO report sources ### Report JSON format -The report JSON should have a corresponding schema that allows for a variety of sources and uses of reports. But if it's a GO report, it should all be in the same format, allowing for interoperability. A JSON schema should validate multiple types of reports. +The report JSON should have a corresponding schema that allows for a variety of sources and uses of reports. The schema should allow interoperability between reports. A JSON schema should validate multiple types of reports from different providers, and so be general to capture different types of data being validated (GAF/GPAD, GO-CAM, etc) + +### One Central Reporting Library + +Currently Ontobio has an ad-hoc, mostly specific to ontobio reporting system. A reporting library for use in any GO context should be made that can be general purpose. Ontobio can then depend on that library. This would have features like: + * Standardized JSON output, guaranteeing conforming to the above schema + * Standard way of reporting messages of different severity levels, with standardized fields, in a way that's idiomatic for python. + * General to different contexts that may want to produce reports given some set of "Rules" -### HEllo +### Produce a Grid View ([go-rules report page](http://snapshot.geneontology.org/reports/gorule-report.html)) -## Generating Rule Report Grid Page +This is fundamentally a set of headers, a set of rules, and each cell is the number of messages/violations for that rule and header. + +The header corresponds to a key in the Message, and all messages that share keys of the value in the header correspond to that column. In this way we can generalize the header, and what we group messages by. This is the `groupable-keys` field at the top level of the [draft report schema](../metadata/draft-report.schema.json). + +In the Report format, the messages may not literally have the key, but maybe all messages in a given report JSON document are said to have some property given in the top level of the report. For example, in the existing go-rules reports, the key `dataset` is given at the top. In the generalized future, we would *normalize* each message with this `dataset` key in the given document, so when generating a grid view with `dataset` as the header, we can correctly select among the messages with the matching `dataset` value. To generate a reports page like at http://snapshot.geneontology.org/reports/gorule-report.html we need: 1. The collection of reports of GO Rule violations 2. A property to "group" the reports by (by default it's `dataset`, like `mgi` or `genedb_lmajor`). This is the set of horizontal headers along the grid. Reports MUST provide a default value in case a Message does not have value 3. Preferably a mapping of whatever value of grouping key above and a URL where we can find that link. For example for the current gorule-report page, we have: `dataset` ->`{base}/reports/{dataset}-report.html#rmd`. -4. Preferably a link to where we can find the specific violations for `(rule-id, grouping-key)`. For example in for teh current gorule-report page, we have: `{base}/reports/{dataset}-report.html#{rule-id}`. +4. Preferably a link to where we can find the specific violations for `(rule-id, grouping-key)`. For example in for the current gorule-report page, we have: `{base}/reports/{dataset}-report.html#{rule-id}`. -This gets us to the gorule-reports.html page, like we have already. +This gets us to the gorule-reports.html page, like we have already. Since in this conception, headers are generalized and provided by the reports, we can generate a grid for any set of existing "groupable" header keys against the go-rules. -## Expansions +As a note on implementation details: generating grid views with different header columns could be done by just producing different HTML pages: `gorule-report.dataset.html`, `gorule-report.taxon.html` or something. Alternatively, since we have the the JSON data either way, a slightly fancier javascript rendering where you can just select which header you want live, and the rebuilding of the table happens within the web page live. No outside web requests would be needed still. -Consider this section more proposal than requirements at this stage. +### Dynamic rendering of reports -In our current setup, we generate outselves the JSON and the MD versions of the report. The Markdown versions are then rendered into HTML and joined with other HTML pages in the reports directory on skyhook/snapshot/et al. Since the process (ontobio) that produces both the JSON and the Markdown reports are the same -- *in this case* -- we can guarantee that what we want to see in the Markdown -> HTML is representative of the JSON. In Ontobio case, the MD report is created *from* the JSON report. +If reports came with a custom template that would take a Message JSON blob and turn it into a single Markdown string, then the reporting library could generate the more user friendly listing of messages, as defined by the template and the general page layout already used by the existing GO Rule reports. See [snapshot fb-report.html](http://snapshot.geneontology.org/reports/fb-report.html#rmd) for an example of the layout. -In this vein, I could foresee a way to generically produce a static HTML page of the reports like we see for a `dataset` or a specific rule now (see http://snapshot.geneontology.org/reports/fb-report.html#rmd for example) using just the report JSON, and not rely on the pre-existence of the MD -> HTML page. +This would then let the generic Grid View generator also link to the auto-generated detailed reports, and it wouldn't necessarily have to rely on an existing report page somewhere. For instance, in making the GO Rule Grid View, we first produce all the HTML report pages (like the fb-report.html above), and then make the Grid View page with that link in mind. -This could look like a lot of things, but the basics of the layout is that only the individual error messages need be different for different error providers. For example the Shex reports have more data in each message, and that's good! - -If a report provider also supplied a property called, say, `message-template` that conformed to the schema: -``` -{ - "type": String, -} -``` - -And provided some template using the values of the keys in the given message, we could produce the MD/HTML page ourselves directly in the report handling procedures. - -For example, our existing message could be templated as: +An example template from our current usage could look like: ``` "{level} - {type}: {message} -- {line}" ``` -But this could be more sophisticated too. - -*Make more of the docs based on use cases* - -## Reporting Process +## Aspirational Reporting Process Given: 1. A collection of report JSON files @@ -72,16 +79,65 @@ Given: * `https://example.com/reports/{group}#{ruleid}` * `{base}/reports/{group}#{ruleid}` - ### Process -1. Normalize all given messages by Rule - * The normalize occurs by placing keys and their values that occur in the top level of the report that are beyond the required keys into each Message seen for the given report. +1. Merge all given messages by Rule + * The merging occurs by placing keys and their values that occur in the top level of the report that are beyond the required keys into each Message seen for the given report. * For example, the existing reports have `group` and `dataset` and keys. For `"group": "mgi"`, we would place `"group": "mgi"` in each Message object, along with `group`, or any other key. * The `rule` value will be replaced with the full ID it appears in. * Messages from other reports have their messages normalized in this way, and then messages within each rule can be added from multiple files. -2. We can now easily merge all given report JSON together. +2. We can now easily merge all given report JSON together, since each message blob has the same keys. 3. Produce the grid data with the total Merged data that will be placed into the HTML template. * We could also produce an HTML template for each `grouping-key` item. 4. *Do we produce a templated HTML for each `entity-type`?* 5. For the more expanded, advanced proposal, we can generate a `{grouping-key}.report.md` file as a human-readable report using the `message-template` in the report. The produced templated HTML can now link to those produced report files. + +As a very concrete example of step 1 above: + +``` +my-report.json +{ + "entities": 2, + "errors": 0, + "valid-entities": 2, + "groupable-keys": [ + { + "key":"taxon", + "default": "taxon:0" + }, + { + "key": "group", + "default": "unknown" + } + ], + "group": "rebels", + "messages": { + "gorule-0000001": [ + { + "level": "WARNING", + "entity": "I'm\ta\tGAF\tline", + "type": "Violates GO Rule", + "message": "This is an error message", + "rule": 1, + "taxon": "taxon:12345" + } + ] + } +} +``` + +The message in `gorule-0000001` would be *merged* to be: + +``` +{ + "level": "WARNING", + "entity": "I'm\ta\tGAF\tline", + "type": "Violates GO Rule", + "message": "This is an error message", + "rule": 1, + "taxon": "taxon:12345", + "group": "rebels" +} +``` + +The key `group` is taken from the top level. Open question of if we want to convert `rule` to be the actual rule ID, `gorule-0000001`.