ontometer 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ontometer-0.1.0/.gitignore +232 -0
- ontometer-0.1.0/CHANGELOG.md +144 -0
- ontometer-0.1.0/CITATION.cff +25 -0
- ontometer-0.1.0/LICENSE +201 -0
- ontometer-0.1.0/NOTICE +15 -0
- ontometer-0.1.0/PKG-INFO +263 -0
- ontometer-0.1.0/README.md +202 -0
- ontometer-0.1.0/ontometer/__init__.py +42 -0
- ontometer-0.1.0/ontometer/assessment.py +104 -0
- ontometer-0.1.0/ontometer/cli/__init__.py +1 -0
- ontometer-0.1.0/ontometer/cli/_entry.py +19 -0
- ontometer-0.1.0/ontometer/cli/main.py +172 -0
- ontometer-0.1.0/ontometer/corpus/README.md +260 -0
- ontometer-0.1.0/ontometer/corpus/__init__.py +29 -0
- ontometer-0.1.0/ontometer/corpus/fetchers/__init__.py +15 -0
- ontometer-0.1.0/ontometer/corpus/fetchers/_base.py +718 -0
- ontometer-0.1.0/ontometer/corpus/fetchers/lov.py +245 -0
- ontometer-0.1.0/ontometer/corpus/fetchers/obo.py +162 -0
- ontometer-0.1.0/ontometer/corpus/fetchers/okg.py +310 -0
- ontometer-0.1.0/ontometer/corpus/fetchers/ontohub.py +179 -0
- ontometer-0.1.0/ontometer/corpus/fetchers/ontoportal.py +350 -0
- ontometer-0.1.0/ontometer/corpus/metadata.py +129 -0
- ontometer-0.1.0/ontometer/corpus/network/README.md +207 -0
- ontometer-0.1.0/ontometer/corpus/network/__init__.py +1 -0
- ontometer-0.1.0/ontometer/corpus/network/construction.py +386 -0
- ontometer-0.1.0/ontometer/corpus/paths.py +204 -0
- ontometer-0.1.0/ontometer/corpus/pipeline/README.md +350 -0
- ontometer-0.1.0/ontometer/corpus/pipeline/__init__.py +30 -0
- ontometer-0.1.0/ontometer/corpus/pipeline/db.py +594 -0
- ontometer-0.1.0/ontometer/corpus/pipeline/dedup.py +427 -0
- ontometer-0.1.0/ontometer/corpus/pipeline/parse.py +2329 -0
- ontometer-0.1.0/ontometer/evaluation.py +77 -0
- ontometer-0.1.0/ontometer/metrics/__init__.py +15 -0
- ontometer-0.1.0/ontometer/metrics/hierarchy.py +146 -0
- ontometer-0.1.0/ontometer/metrics/oquare.py +237 -0
- ontometer-0.1.0/ontometer/metrics/seeds.py +81 -0
- ontometer-0.1.0/ontometer/model/__init__.py +10 -0
- ontometer-0.1.0/ontometer/model/load.py +121 -0
- ontometer-0.1.0/ontometer/model/quality_model.yaml +87 -0
- ontometer-0.1.0/ontometer/model/scales.yaml +45 -0
- ontometer-0.1.0/ontometer/onto/__init__.py +14 -0
- ontometer-0.1.0/ontometer/onto/load.py +125 -0
- ontometer-0.1.0/ontometer/onto/namespaces.py +93 -0
- ontometer-0.1.0/ontometer/onto/obo.py +149 -0
- ontometer-0.1.0/ontometer/onto/view.py +259 -0
- ontometer-0.1.0/ontometer/report/__init__.py +5 -0
- ontometer-0.1.0/ontometer/report/render.py +179 -0
- ontometer-0.1.0/ontometer/review/__init__.py +14 -0
- ontometer-0.1.0/ontometer/review/findings.py +49 -0
- ontometer-0.1.0/ontometer/review/llm.py +187 -0
- ontometer-0.1.0/ontometer/review/prompt.py +87 -0
- ontometer-0.1.0/ontometer/review/run.py +103 -0
- ontometer-0.1.0/ontometer/settings.py +62 -0
- ontometer-0.1.0/pyproject.toml +126 -0
- ontometer-0.1.0/test/__init__.py +0 -0
- ontometer-0.1.0/test/conftest.py +47 -0
- ontometer-0.1.0/test/fixtures/cyclic.ttl +14 -0
- ontometer-0.1.0/test/fixtures/diamond.ttl +11 -0
- ontometer-0.1.0/test/fixtures/empty.ttl +3 -0
- ontometer-0.1.0/test/fixtures/inherited.ttl +15 -0
- ontometer-0.1.0/test/fixtures/small.obo +36 -0
- ontometer-0.1.0/test/fixtures/small.ttl +27 -0
- ontometer-0.1.0/test/fixtures/zipped.rdf +0 -0
- ontometer-0.1.0/test/test_assessment.py +54 -0
- ontometer-0.1.0/test/test_corpus_metadata.py +97 -0
- ontometer-0.1.0/test/test_corpus_paths.py +97 -0
- ontometer-0.1.0/test/test_corpus_resolution.py +174 -0
- ontometer-0.1.0/test/test_hierarchy.py +70 -0
- ontometer-0.1.0/test/test_load.py +26 -0
- ontometer-0.1.0/test/test_metrics.py +64 -0
- ontometer-0.1.0/test/test_model.py +78 -0
- ontometer-0.1.0/test/test_namespaces.py +56 -0
- ontometer-0.1.0/test/test_obo.py +92 -0
- ontometer-0.1.0/test/test_perturbation.py +93 -0
- ontometer-0.1.0/test/test_review.py +167 -0
- ontometer-0.1.0/test/test_view.py +70 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
|
|
2
|
+
# Byte-compiled / optimized / DLL files
|
|
3
|
+
__pycache__/
|
|
4
|
+
*.py[codz]
|
|
5
|
+
*$py.class
|
|
6
|
+
|
|
7
|
+
# C extensions
|
|
8
|
+
*.so
|
|
9
|
+
|
|
10
|
+
# Distribution / packaging
|
|
11
|
+
.Python
|
|
12
|
+
build/
|
|
13
|
+
develop-eggs/
|
|
14
|
+
dist/
|
|
15
|
+
downloads/
|
|
16
|
+
eggs/
|
|
17
|
+
.eggs/
|
|
18
|
+
lib/
|
|
19
|
+
lib64/
|
|
20
|
+
parts/
|
|
21
|
+
sdist/
|
|
22
|
+
var/
|
|
23
|
+
wheels/
|
|
24
|
+
share/python-wheels/
|
|
25
|
+
*.egg-info/
|
|
26
|
+
.installed.cfg
|
|
27
|
+
*.egg
|
|
28
|
+
MANIFEST
|
|
29
|
+
|
|
30
|
+
# PyInstaller
|
|
31
|
+
# Usually these files are written by a python script from a template
|
|
32
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
33
|
+
*.manifest
|
|
34
|
+
*.spec
|
|
35
|
+
|
|
36
|
+
# Installer logs
|
|
37
|
+
pip-log.txt
|
|
38
|
+
pip-delete-this-directory.txt
|
|
39
|
+
|
|
40
|
+
# Unit test / coverage reports
|
|
41
|
+
htmlcov/
|
|
42
|
+
.tox/
|
|
43
|
+
.nox/
|
|
44
|
+
.coverage
|
|
45
|
+
.coverage.*
|
|
46
|
+
.cache
|
|
47
|
+
nosetests.xml
|
|
48
|
+
coverage.xml
|
|
49
|
+
*.cover
|
|
50
|
+
*.py.cover
|
|
51
|
+
.hypothesis/
|
|
52
|
+
.pytest_cache/
|
|
53
|
+
cover/
|
|
54
|
+
|
|
55
|
+
# Translations
|
|
56
|
+
*.mo
|
|
57
|
+
*.pot
|
|
58
|
+
|
|
59
|
+
# Django stuff:
|
|
60
|
+
*.log
|
|
61
|
+
local_settings.py
|
|
62
|
+
db.sqlite3
|
|
63
|
+
db.sqlite3-journal
|
|
64
|
+
|
|
65
|
+
# Flask stuff:
|
|
66
|
+
instance/
|
|
67
|
+
.webassets-cache
|
|
68
|
+
|
|
69
|
+
# Scrapy stuff:
|
|
70
|
+
.scrapy
|
|
71
|
+
|
|
72
|
+
# Sphinx documentation
|
|
73
|
+
docs/_build/
|
|
74
|
+
|
|
75
|
+
# PyBuilder
|
|
76
|
+
.pybuilder/
|
|
77
|
+
target/
|
|
78
|
+
|
|
79
|
+
# Jupyter Notebook
|
|
80
|
+
.ipynb_checkpoints
|
|
81
|
+
|
|
82
|
+
# IPython
|
|
83
|
+
profile_default/
|
|
84
|
+
ipython_config.py
|
|
85
|
+
|
|
86
|
+
# pyenv
|
|
87
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
88
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
89
|
+
# .python-version
|
|
90
|
+
|
|
91
|
+
# pipenv
|
|
92
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
93
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
94
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
95
|
+
# install all needed dependencies.
|
|
96
|
+
# Pipfile.lock
|
|
97
|
+
|
|
98
|
+
# UV
|
|
99
|
+
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
|
100
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
101
|
+
# commonly ignored for libraries.
|
|
102
|
+
# uv.lock
|
|
103
|
+
|
|
104
|
+
# poetry
|
|
105
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
106
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
107
|
+
# commonly ignored for libraries.
|
|
108
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
109
|
+
# poetry.lock
|
|
110
|
+
# poetry.toml
|
|
111
|
+
|
|
112
|
+
# pdm
|
|
113
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
114
|
+
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
|
|
115
|
+
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
|
|
116
|
+
# pdm.lock
|
|
117
|
+
# pdm.toml
|
|
118
|
+
.pdm-python
|
|
119
|
+
.pdm-build/
|
|
120
|
+
|
|
121
|
+
# pixi
|
|
122
|
+
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
|
|
123
|
+
# pixi.lock
|
|
124
|
+
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
|
|
125
|
+
# in the .venv directory. It is recommended not to include this directory in version control.
|
|
126
|
+
.pixi
|
|
127
|
+
|
|
128
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
129
|
+
__pypackages__/
|
|
130
|
+
|
|
131
|
+
# Celery stuff
|
|
132
|
+
celerybeat-schedule
|
|
133
|
+
celerybeat.pid
|
|
134
|
+
|
|
135
|
+
# Redis
|
|
136
|
+
*.rdb
|
|
137
|
+
*.aof
|
|
138
|
+
*.pid
|
|
139
|
+
|
|
140
|
+
# RabbitMQ
|
|
141
|
+
mnesia/
|
|
142
|
+
rabbitmq/
|
|
143
|
+
rabbitmq-data/
|
|
144
|
+
|
|
145
|
+
# ActiveMQ
|
|
146
|
+
activemq-data/
|
|
147
|
+
|
|
148
|
+
# SageMath parsed files
|
|
149
|
+
*.sage.py
|
|
150
|
+
|
|
151
|
+
# Environments
|
|
152
|
+
*.env
|
|
153
|
+
.envrc
|
|
154
|
+
.venv
|
|
155
|
+
env/
|
|
156
|
+
venv/
|
|
157
|
+
ENV/
|
|
158
|
+
env.bak/
|
|
159
|
+
venv.bak/
|
|
160
|
+
|
|
161
|
+
# Spyder project settings
|
|
162
|
+
.spyderproject
|
|
163
|
+
.spyproject
|
|
164
|
+
|
|
165
|
+
# Rope project settings
|
|
166
|
+
.ropeproject
|
|
167
|
+
|
|
168
|
+
# mkdocs documentation
|
|
169
|
+
/site
|
|
170
|
+
|
|
171
|
+
# mypy
|
|
172
|
+
.mypy_cache/
|
|
173
|
+
.dmypy.json
|
|
174
|
+
dmypy.json
|
|
175
|
+
|
|
176
|
+
# Pyre type checker
|
|
177
|
+
.pyre/
|
|
178
|
+
|
|
179
|
+
# pytype static type analyzer
|
|
180
|
+
.pytype/
|
|
181
|
+
|
|
182
|
+
# Cython debug symbols
|
|
183
|
+
cython_debug/
|
|
184
|
+
|
|
185
|
+
# PyCharm
|
|
186
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
187
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
188
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
189
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
190
|
+
# .idea/
|
|
191
|
+
|
|
192
|
+
# Abstra
|
|
193
|
+
# Abstra is an AI-powered process automation framework.
|
|
194
|
+
# Ignore directories containing user credentials, local state, and settings.
|
|
195
|
+
# Learn more at https://abstra.io/docs
|
|
196
|
+
.abstra/
|
|
197
|
+
|
|
198
|
+
# Visual Studio Code
|
|
199
|
+
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
|
|
200
|
+
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
|
|
201
|
+
# and can be added to the global gitignore or merged into this file. However, if you prefer,
|
|
202
|
+
# you could uncomment the following to ignore the entire vscode folder
|
|
203
|
+
# .vscode/
|
|
204
|
+
# Temporary file for partial code execution
|
|
205
|
+
tempCodeRunnerFile.py
|
|
206
|
+
|
|
207
|
+
# Ruff stuff:
|
|
208
|
+
.ruff_cache/
|
|
209
|
+
|
|
210
|
+
# PyPI configuration file
|
|
211
|
+
.pypirc
|
|
212
|
+
|
|
213
|
+
# Marimo
|
|
214
|
+
marimo/_static/
|
|
215
|
+
marimo/_lsp/
|
|
216
|
+
__marimo__/
|
|
217
|
+
|
|
218
|
+
# Streamlit
|
|
219
|
+
.streamlit/secrets.toml
|
|
220
|
+
.idea
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
# backups
|
|
224
|
+
*.bak
|
|
225
|
+
|
|
226
|
+
# SQLite sidecars — transient, created whenever the corpus DB is opened.
|
|
227
|
+
data/*.db-wal
|
|
228
|
+
data/*.db-shm
|
|
229
|
+
|
|
230
|
+
# Local pre-fix snapshots of the corpus DB/manifest — not *.bak (named like
|
|
231
|
+
# corpus.db.bak-before-streaming-fix, so that pattern doesn't catch them).
|
|
232
|
+
data/backup/
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
**This release turns a corpus pipeline into a package someone can install.**
|
|
11
|
+
Until now the repository held a multi-registry ontology corpus and a parse
|
|
12
|
+
pipeline, with every derived metric living in a notebook — nothing in it took an
|
|
13
|
+
ontology file and returned an assessment. The evaluator is new, the research half
|
|
14
|
+
moved under `ontometer.corpus`, and the distribution metadata now says what the
|
|
15
|
+
license is.
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
|
|
19
|
+
- **`ontometer eval <file>` — the single-ontology evaluator.** Loads an ontology,
|
|
20
|
+
computes the sixteen OQuaRE metrics, scales each to 1–5, rolls them up through
|
|
21
|
+
the quality model, and renders Markdown or JSON. `--fail-under` exits non-zero
|
|
22
|
+
below a threshold, for CI use.
|
|
23
|
+
- **The quality model ships as configuration, not code.** `model/scales.yaml`
|
|
24
|
+
holds the threshold families; `model/quality_model.yaml` holds the
|
|
25
|
+
characteristic → sub-characteristic → metric map and names the aggregation
|
|
26
|
+
rule. Both are read at runtime, so thresholds can be retuned for a domain
|
|
27
|
+
without forking. `ontometer model --what scales|characteristics|unsupported`
|
|
28
|
+
prints what the current build uses.
|
|
29
|
+
- **Every metric carries the formula it computes.** The published OQuaRE sources
|
|
30
|
+
disagree with each other on several metrics, so each one reports its own
|
|
31
|
+
definition in the metric table rather than leaving a reader to guess which
|
|
32
|
+
rendering was implemented.
|
|
33
|
+
- **An LLM review, grounded on the metrics.** The five weakest metrics and the
|
|
34
|
+
specific entities driving them are passed to the model, which explains and
|
|
35
|
+
recommends but never emits a number the report presents as a measurement.
|
|
36
|
+
Findings are ranked `defect` / `weakness` / `suggestion`, where `defect` means
|
|
37
|
+
a reasoner would draw a different conclusion.
|
|
38
|
+
- **Ollama and OpenAI providers**, selected by `LLM_PROVIDER`. Configuration is
|
|
39
|
+
read from the process environment under the `LLM_` prefix.
|
|
40
|
+
- **Seed-term heuristics** mapping a weak metric back to the entities responsible
|
|
41
|
+
for it — classes with no individuals, properties with no declared domain,
|
|
42
|
+
undocumented classes, tangled classes, the deepest and widest parts of the
|
|
43
|
+
hierarchy.
|
|
44
|
+
- **Subsumption-cycle detection.** Classes trapped in a cycle are reported
|
|
45
|
+
explicitly, independently of any metric.
|
|
46
|
+
- **A test suite.** There were none; `test/` now covers metric values against
|
|
47
|
+
hand-checked fixtures, scale boundaries, model/registry agreement, and the full
|
|
48
|
+
review path against a fake chat model with no network.
|
|
49
|
+
|
|
50
|
+
### Changed
|
|
51
|
+
|
|
52
|
+
- **The research half moved to `ontometer.corpus`** (`fetchers`, `pipeline`,
|
|
53
|
+
`network`) and sits behind the `corpus` extra, so the base install no longer
|
|
54
|
+
pulls a scraping, dataframe and plotting stack onto users of the evaluator.
|
|
55
|
+
Importing it without the extra raises a directive message naming what to
|
|
56
|
+
install.
|
|
57
|
+
- **Namespace helpers are public and shared.** `iri_namespace` and the
|
|
58
|
+
generic-namespace set were private to the corpus parser and reached across a
|
|
59
|
+
`sys.path` insertion by the coupling script. They now live in
|
|
60
|
+
`ontometer.onto.namespaces`, and the parser reads them from there — one
|
|
61
|
+
definition, not two, because a duplicated generic-namespace set drifts and
|
|
62
|
+
makes coupling numbers from the two halves incomparable. The evaluator gains
|
|
63
|
+
the parser's OBO handling as a result: OBO terms split by their `PREFIX_`
|
|
64
|
+
rather than collapsing onto the shared `purl.obolibrary.org/obo/` path.
|
|
65
|
+
- **The corpus artifacts in `data/` are compact rather than untracked.** They
|
|
66
|
+
stay in git — they cannot be re-fetched into existence, since the registries
|
|
67
|
+
they came from change underneath you and the object store they were parsed
|
|
68
|
+
from lives on the machine that ran the crawl. What changed is their size:
|
|
69
|
+
`corpus.db` 98.0 MiB → 34.3 MiB, `manifest.jsonl` 67.5 MiB → 13.3 MiB, the
|
|
70
|
+
network 8.3 MiB → 1.3 MiB, `data/` overall ~175 MiB → ~49 MiB. This was not
|
|
71
|
+
optional housekeeping: `corpus.db` had reached 97.97 MiB against GitHub's hard
|
|
72
|
+
100 MiB push limit, growing 3.4 MiB in a single refresh.
|
|
73
|
+
- **Registry metadata is projected to a field allowlist before storage**
|
|
74
|
+
(`ontometer/corpus/metadata.py`). The verbatim API response was 58 MiB, 72% of
|
|
75
|
+
the database, written a second time into `manifest.jsonl` — which was 92% this
|
|
76
|
+
one field — and read by nothing. Kept: `description`, `name`, `acronym`,
|
|
77
|
+
`hasDomain`, `group`, `hasOntologyLanguage`, `hasLicense`, `homepage`,
|
|
78
|
+
`publication`, `version`, `status`. Dropped: the JSON-LD `links` and
|
|
79
|
+
`@context` boilerplate (24 MiB of templated URLs), and `contact`,
|
|
80
|
+
`administeredBy`, `reviews` and `projects` — which carried several hundred
|
|
81
|
+
ontology maintainers' names and email addresses. Addresses are redacted from
|
|
82
|
+
retained free text as well. The projection runs at fetch time, so a new crawl
|
|
83
|
+
never materialises the bulk.
|
|
84
|
+
- **`parse_error` is bounded at 2,000 characters.** Two rows held 7.28 of the
|
|
85
|
+
7.31 MiB the column occupied, because an rdflib error echoed an entire
|
|
86
|
+
unparseable file back into its own message.
|
|
87
|
+
- **`retrieved_file` is stored relative to the object-store root.** It held
|
|
88
|
+
absolute paths into the home directory of the machine that ran the crawl,
|
|
89
|
+
which resolve nowhere else.
|
|
90
|
+
- **The dependency network is two Parquet tables, not a pickle.** Loading a
|
|
91
|
+
pickle executes arbitrary code, which is not acceptable for an artifact
|
|
92
|
+
intended to be published and downloaded; the pair is also a sixth of the size
|
|
93
|
+
and round-trips the graph exactly.
|
|
94
|
+
- **Every filesystem location is a parameter.** `ontometer/corpus/paths.py`
|
|
95
|
+
resolves exactly two inputs — `--data-dir` / `ONTOMETER_DATA_DIR` for tracked
|
|
96
|
+
artifacts and `--ontology-dir` / `ONTOLOGY_DIR` for the object store — and
|
|
97
|
+
derives everything else. Each stage previously computed its own: some from
|
|
98
|
+
`__file__` (the repository root from a checkout, `site-packages` once
|
|
99
|
+
installed), one with a hardcoded fallback into a specific user's home
|
|
100
|
+
directory, and the object-store root was read from the environment deep inside
|
|
101
|
+
a parse worker. Every `run/` script and the network builder now take both
|
|
102
|
+
flags, so a run can be pointed at a scratch directory.
|
|
103
|
+
- **`retrieved_file` resolves on any machine.** Paths are stored relative to the
|
|
104
|
+
object-store root and resolved in the parent process before a worker sees
|
|
105
|
+
them; `CorpusPaths.resolve_object` still accepts the absolute paths older
|
|
106
|
+
databases hold, re-anchoring them on the configured store.
|
|
107
|
+
- **The metadata projection is applied at the seed boundary too**, not only at
|
|
108
|
+
fetch time — a manifest captured before the projection existed still holds the
|
|
109
|
+
full registry response, and seeding from one must not put it back into the
|
|
110
|
+
database.
|
|
111
|
+
- **The retired `graph_hash` and `fuseki_*` columns are gone**, along with the
|
|
112
|
+
`update_fuseki` writer that no longer had callers, and `okg_metadata.json`,
|
|
113
|
+
a 1 MiB registry cache nothing read.
|
|
114
|
+
|
|
115
|
+
### Fixed
|
|
116
|
+
|
|
117
|
+
- **The distribution declared no license.** `LICENSE` was already Apache-2.0 but
|
|
118
|
+
neither `pyproject.toml` nor the copyright appendix said so, so PyPI would have
|
|
119
|
+
rendered the package as unlicensed.
|
|
120
|
+
- **Network construction resolved paths relative to the repository root**, which
|
|
121
|
+
in an installed wheel pointed inside `site-packages`.
|
|
122
|
+
- **`dotenv` was declared as a dependency alongside `python-dotenv`.** They are
|
|
123
|
+
different packages; the code imports the latter. `pip` was also declared as a
|
|
124
|
+
runtime dependency.
|
|
125
|
+
- **Vocabularies without an `owl:Ontology` declaration entered the network as
|
|
126
|
+
anonymous `row:<id>` nodes** that nothing could reference, zeroing their
|
|
127
|
+
in-degree. Where the registry's `source_id` carries the IRI (LOV's does), it
|
|
128
|
+
is now used as a fallback, and the new `iri_source` column records `declared`
|
|
129
|
+
vs `registry`. (@dahrb)
|
|
130
|
+
- **`rdf:Property` terms were not counted as properties**, so pre-OWL
|
|
131
|
+
vocabularies reported none. `property_count` and `compute_content_hash` now
|
|
132
|
+
share one type list, and dedup Pass B rejects the empty content hash directly
|
|
133
|
+
instead of trusting the counters as a proxy for it. (@dahrb)
|
|
134
|
+
- **Usage edges to generic namespaces (FOAF, SKOS, RDF, …) always became external
|
|
135
|
+
placeholders**, even when the vocabulary itself was in the corpus, splitting
|
|
136
|
+
one vocabulary across two nodes. They now resolve to the owning row when that
|
|
137
|
+
row comes from LOV, the curated registry of such vocabularies; otherwise they
|
|
138
|
+
stay external. A namespace with a trailing `#` or `/` now also matches its
|
|
139
|
+
ontology's bare IRI, and a row referencing its own generic namespace no longer
|
|
140
|
+
gets a self-loop. The network build prints which generic namespaces merged.
|
|
141
|
+
(@dahrb)
|
|
142
|
+
- **A failed structural-sidecar write was silently swallowed**, which made an
|
|
143
|
+
ontology indistinguishable from one without a hierarchy in the structural
|
|
144
|
+
metrics. It now prints a warning. (@dahrb)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
message: "If you use this software, please cite it as below."
|
|
3
|
+
title: "OntoMeter: ontology quality assessment"
|
|
4
|
+
abstract: >-
|
|
5
|
+
OntoMeter evaluates a single ontology against the OQuaRE quality model and
|
|
6
|
+
adds a language-model review of the quality dimensions that structural metrics
|
|
7
|
+
cannot cover. It also carries a corpus-scale research half that builds a
|
|
8
|
+
multi-registry ontology corpus and its dependency network.
|
|
9
|
+
type: software
|
|
10
|
+
authors:
|
|
11
|
+
- family-names: Belikov
|
|
12
|
+
given-names: Alexander
|
|
13
|
+
email: alexander@growgraph.dev
|
|
14
|
+
- family-names: Bareham
|
|
15
|
+
given-names: David
|
|
16
|
+
email: d.bareham@liverpool.ac.uk
|
|
17
|
+
repository-code: "https://github.com/growgraph/OntoMeter"
|
|
18
|
+
license: Apache-2.0
|
|
19
|
+
version: 0.1.0
|
|
20
|
+
keywords:
|
|
21
|
+
- ontology
|
|
22
|
+
- ontology evaluation
|
|
23
|
+
- OQuaRE
|
|
24
|
+
- knowledge graphs
|
|
25
|
+
- semantic web
|
ontometer-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
4
|
+
|
|
5
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
6
|
+
|
|
7
|
+
1. Definitions.
|
|
8
|
+
|
|
9
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
10
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
11
|
+
|
|
12
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
13
|
+
the copyright owner that is granting the License.
|
|
14
|
+
|
|
15
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
16
|
+
other entities that control, are controlled by, or are under common
|
|
17
|
+
control with that entity. For the purposes of this definition,
|
|
18
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
19
|
+
direction or management of such entity, whether by contract or
|
|
20
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
21
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
22
|
+
|
|
23
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
24
|
+
exercising permissions granted by this License.
|
|
25
|
+
|
|
26
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
27
|
+
including but not limited to software source code, documentation
|
|
28
|
+
source, and configuration files.
|
|
29
|
+
|
|
30
|
+
"Object" form shall mean any form resulting from mechanical
|
|
31
|
+
transformation or translation of a Source form, including but
|
|
32
|
+
not limited to compiled object code, generated documentation,
|
|
33
|
+
and conversions to other media types.
|
|
34
|
+
|
|
35
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
36
|
+
Object form, made available under the License, as indicated by a
|
|
37
|
+
copyright notice that is included in or attached to the work
|
|
38
|
+
(an example is provided in the Appendix below).
|
|
39
|
+
|
|
40
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
41
|
+
form, that is based on (or derived from) the Work and for which the
|
|
42
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
43
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
44
|
+
of this License, Derivative Works shall not include works that remain
|
|
45
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
46
|
+
the Work and Derivative Works thereof.
|
|
47
|
+
|
|
48
|
+
"Contribution" shall mean any work of authorship, including
|
|
49
|
+
the original version of the Work and any modifications or additions
|
|
50
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
51
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
52
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
53
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
54
|
+
means any form of electronic, verbal, or written communication sent
|
|
55
|
+
to the Licensor or its representatives, including but not limited to
|
|
56
|
+
communication on electronic mailing lists, source code control systems,
|
|
57
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
58
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
59
|
+
excluding communication that is conspicuously marked or otherwise
|
|
60
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
61
|
+
|
|
62
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
63
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
64
|
+
subsequently incorporated within the Work.
|
|
65
|
+
|
|
66
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
67
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
68
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
69
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
70
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
71
|
+
Work and such Derivative Works in Source or Object form.
|
|
72
|
+
|
|
73
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
74
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
75
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
76
|
+
(except as stated in this section) patent license to make, have made,
|
|
77
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
78
|
+
where such license applies only to those patent claims licensable
|
|
79
|
+
by such Contributor that are necessarily infringed by their
|
|
80
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
81
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
82
|
+
institute patent litigation against any entity (including a
|
|
83
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
84
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
85
|
+
or contributory patent infringement, then any patent licenses
|
|
86
|
+
granted to You under this License for that Work shall terminate
|
|
87
|
+
as of the date such litigation is filed.
|
|
88
|
+
|
|
89
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
90
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
91
|
+
modifications, and in Source or Object form, provided that You
|
|
92
|
+
meet the following conditions:
|
|
93
|
+
|
|
94
|
+
(a) You must give any other recipients of the Work or
|
|
95
|
+
Derivative Works a copy of this License; and
|
|
96
|
+
|
|
97
|
+
(b) You must cause any modified files to carry prominent notices
|
|
98
|
+
stating that You changed the files; and
|
|
99
|
+
|
|
100
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
101
|
+
that You distribute, all copyright, patent, trademark, and
|
|
102
|
+
attribution notices from the Source form of the Work,
|
|
103
|
+
excluding those notices that do not pertain to any part of
|
|
104
|
+
the Derivative Works; and
|
|
105
|
+
|
|
106
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
107
|
+
distribution, then any Derivative Works that You distribute must
|
|
108
|
+
include a readable copy of the attribution notices contained
|
|
109
|
+
within such NOTICE file, excluding those notices that do not
|
|
110
|
+
pertain to any part of the Derivative Works, in at least one
|
|
111
|
+
of the following places: within a NOTICE text file distributed
|
|
112
|
+
as part of the Derivative Works; within the Source form or
|
|
113
|
+
documentation, if provided along with the Derivative Works; or,
|
|
114
|
+
within a display generated by the Derivative Works, if and
|
|
115
|
+
wherever such third-party notices normally appear. The contents
|
|
116
|
+
of the NOTICE file are for informational purposes only and
|
|
117
|
+
do not modify the License. You may add Your own attribution
|
|
118
|
+
notices within Derivative Works that You distribute, alongside
|
|
119
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
120
|
+
that such additional attribution notices cannot be construed
|
|
121
|
+
as modifying the License.
|
|
122
|
+
|
|
123
|
+
You may add Your own copyright statement to Your modifications and
|
|
124
|
+
may provide additional or different license terms and conditions
|
|
125
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
126
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
127
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
128
|
+
the conditions stated in this License.
|
|
129
|
+
|
|
130
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
131
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
132
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
133
|
+
this License, without any additional terms or conditions.
|
|
134
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
135
|
+
the terms of any separate license agreement you may have executed
|
|
136
|
+
with Licensor regarding such Contributions.
|
|
137
|
+
|
|
138
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
139
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
140
|
+
except as required for reasonable and customary use in describing the
|
|
141
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
142
|
+
|
|
143
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
144
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
145
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
146
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
147
|
+
implied, including, without limitation, any warranties or conditions
|
|
148
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
149
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
150
|
+
appropriateness of using or redistributing the Work and assume any
|
|
151
|
+
risks associated with Your exercise of permissions under this License.
|
|
152
|
+
|
|
153
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
154
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
155
|
+
unless required by applicable law (such as deliberate and grossly
|
|
156
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
157
|
+
liable to You for damages, including any direct, indirect, special,
|
|
158
|
+
incidental, or consequential damages of any character arising as a
|
|
159
|
+
result of this License or out of the use or inability to use the
|
|
160
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
161
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
162
|
+
other commercial damages or losses), even if such Contributor
|
|
163
|
+
has been advised of the possibility of such damages.
|
|
164
|
+
|
|
165
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
166
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
167
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
168
|
+
or other liability obligations and/or rights consistent with this
|
|
169
|
+
License. However, in accepting such obligations, You may act only
|
|
170
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
171
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
172
|
+
defend, and hold each Contributor harmless for any liability
|
|
173
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
174
|
+
of your accepting any such warranty or additional liability.
|
|
175
|
+
|
|
176
|
+
END OF TERMS AND CONDITIONS
|
|
177
|
+
|
|
178
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
179
|
+
|
|
180
|
+
To apply the Apache License to your work, attach the following
|
|
181
|
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
182
|
+
replaced with your own identifying information. (Don't include
|
|
183
|
+
the brackets!) The text should be enclosed in the appropriate
|
|
184
|
+
comment syntax for the file format. We also recommend that a
|
|
185
|
+
file or class name and description of purpose be included on the
|
|
186
|
+
same "printed page" as the copyright notice for easier
|
|
187
|
+
identification within third-party archives.
|
|
188
|
+
|
|
189
|
+
Copyright 2025-2026 Growgraph SAS
|
|
190
|
+
|
|
191
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
192
|
+
you may not use this file except in compliance with the License.
|
|
193
|
+
You may obtain a copy of the License at
|
|
194
|
+
|
|
195
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
196
|
+
|
|
197
|
+
Unless required by applicable law or agreed to in writing, software
|
|
198
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
199
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
200
|
+
See the License for the specific language governing permissions and
|
|
201
|
+
limitations under the License.
|
ontometer-0.1.0/NOTICE
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
OntoMeter — ontology quality assessment
|
|
2
|
+
Copyright 2025-2026 Growgraph SAS
|
|
3
|
+
|
|
4
|
+
Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
|
5
|
+
use this software except in compliance with the License. You may obtain a
|
|
6
|
+
copy of the License at
|
|
7
|
+
|
|
8
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
|
|
10
|
+
"OntoMeter" and "GrowGraph" are trademarks of Growgraph SAS. The License does
|
|
11
|
+
not grant permission to use these trademarks except as required to describe
|
|
12
|
+
the origin of the software.
|
|
13
|
+
|
|
14
|
+
This product implements metrics from the OQuaRE ontology quality framework
|
|
15
|
+
(Duque-Ramos et al.), an independent work not affiliated with this project.
|