Initial commit
This commit is contained in:
12
.claude-plugin/plugin.json
Normal file
12
.claude-plugin/plugin.json
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"name": "ontology-access-kit",
|
||||||
|
"description": "Skills for querying ontologies using the Ontology Access Kit (OAK)",
|
||||||
|
"version": "0.0.0-2025.11.28",
|
||||||
|
"author": {
|
||||||
|
"name": "Chris Mungall",
|
||||||
|
"email": "cjmungall@lbl.gov"
|
||||||
|
},
|
||||||
|
"skills": [
|
||||||
|
"./skills/ontology-access-kit"
|
||||||
|
]
|
||||||
|
}
|
||||||
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# ontology-access-kit
|
||||||
|
|
||||||
|
Skills for querying ontologies using the Ontology Access Kit (OAK)
|
||||||
44
plugin.lock.json
Normal file
44
plugin.lock.json
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"$schema": "internal://schemas/plugin.lock.v1.json",
|
||||||
|
"pluginId": "gh:ai4curation/curation-skills:ontology-access-kit",
|
||||||
|
"normalized": {
|
||||||
|
"repo": null,
|
||||||
|
"ref": "refs/tags/v20251128.0",
|
||||||
|
"commit": "72708fc18d1f829be261ec919c737f934ebb8e70",
|
||||||
|
"treeHash": "e85fa79861657b9e36badaa5226709a74a4a8e7e45164f568d82addc74ce2137",
|
||||||
|
"generatedAt": "2025-11-28T10:13:05.824382Z",
|
||||||
|
"toolVersion": "publish_plugins.py@0.2.0"
|
||||||
|
},
|
||||||
|
"origin": {
|
||||||
|
"remote": "git@github.com:zhongweili/42plugin-data.git",
|
||||||
|
"branch": "master",
|
||||||
|
"commit": "aa1497ed0949fd50e99e70d6324a29c5b34f9390",
|
||||||
|
"repoRoot": "/Users/zhongweili/projects/openmind/42plugin-data"
|
||||||
|
},
|
||||||
|
"manifest": {
|
||||||
|
"name": "ontology-access-kit",
|
||||||
|
"description": "Skills for querying ontologies using the Ontology Access Kit (OAK)"
|
||||||
|
},
|
||||||
|
"content": {
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "README.md",
|
||||||
|
"sha256": "2ab38d78d22629c567c3a311b78997a04d3e73982cb47157cc7e9606643112c2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": ".claude-plugin/plugin.json",
|
||||||
|
"sha256": "dbbbf44fa469b2245d5857dac937294c7af0da81867c62ac889a7788daac3157"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/ontology-access-kit/SKILL.md",
|
||||||
|
"sha256": "59b5bfb1f7c5736daaa65bf847fb195b14012d1472708610bb0c6272a7bf077f"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dirSha256": "e85fa79861657b9e36badaa5226709a74a4a8e7e45164f568d82addc74ce2137"
|
||||||
|
},
|
||||||
|
"security": {
|
||||||
|
"scannedAt": null,
|
||||||
|
"scannerVersion": null,
|
||||||
|
"flags": []
|
||||||
|
}
|
||||||
|
}
|
||||||
105
skills/ontology-access-kit/SKILL.md
Normal file
105
skills/ontology-access-kit/SKILL.md
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
---
|
||||||
|
name: ontology-access-kit
|
||||||
|
description: Skills for querying ontologies using the Ontology Access Kit (OAK). This should only be used for complex ontology operations, for basic external ontology searching use the OLS MCP
|
||||||
|
---
|
||||||
|
|
||||||
|
# OAK Guide
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
OAK is a powerful command line library for accessing ontologies. It can be installed via:
|
||||||
|
|
||||||
|
- `uv add oaklib`
|
||||||
|
- `pip install oaklib`
|
||||||
|
|
||||||
|
The main command is `runoak`
|
||||||
|
|
||||||
|
## When to use
|
||||||
|
|
||||||
|
OAK is generally to be used for more complex operations.
|
||||||
|
|
||||||
|
- if you want to do basic search over external ontologies, you should favor the OLS MCP over OAK
|
||||||
|
- if you are working with local obo files, then hacky obo tools like `obo-grep.pl` may be better
|
||||||
|
|
||||||
|
## Adapters
|
||||||
|
|
||||||
|
You typically want to use the sqlite adapter. This gives you fast access to any ontology in OBO, plus a number of other commonly used ontologies, found in semantic-sql.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
`runoak -i sqlite:obo:cl COMMAND COMMAND-OPTS ARGS`
|
||||||
|
|
||||||
|
Note the `-i` comes (*before*) the command-specific opts
|
||||||
|
|
||||||
|
You can also access any ontology in OLS or BioPortal:
|
||||||
|
|
||||||
|
- `runoak -i bioportal:snomedct relationships SNOMEDCT:128351009`
|
||||||
|
- `runoak -i bioportal:efo tree -p i EFO:0004200`
|
||||||
|
|
||||||
|
But some OAK commands may not be implemented.
|
||||||
|
|
||||||
|
With OLS or BioPortal you can also do searches over all ontologies:
|
||||||
|
|
||||||
|
- `runoak -i bioportal: info l~NovaSeq`
|
||||||
|
- `runoak -i ols: info l~NovaSeq`
|
||||||
|
|
||||||
|
To work with local obo files:
|
||||||
|
|
||||||
|
- `runoak -i impleobo:my_ont.obo info MY:1234 -O obo`
|
||||||
|
|
||||||
|
## Common Operations
|
||||||
|
|
||||||
|
You can find a list of all commands with `runoak --help`. oak is highly fully featured, and you are encouraged to
|
||||||
|
explore to find the functionality you need. We provide some examples below.
|
||||||
|
|
||||||
|
We use `info` for many examples, but note that many options and arguments work across different commands
|
||||||
|
|
||||||
|
* Lookup
|
||||||
|
* By exact label: `runoak -i sqlite:obo:cl info neuron` (returns `CL:0000540 ! neuron`)
|
||||||
|
* By exact label (multiple): `runoak -i sqlite:obo:uberon info finger toe`
|
||||||
|
* Search (any match): `runoak -i sqlite:obo:cl info 'l~T cell'`
|
||||||
|
* Search (starts with): `runoak -i sqlite:obo:cl info l^neuron`
|
||||||
|
* Fetching detailed info
|
||||||
|
* OBO format: `runoak -i sqlite:obo:cl info CL:0000540 -O obo`
|
||||||
|
* relationships: `runoak -i sqlite:obo:cl relationships --direction both CL:0000540`
|
||||||
|
* mappings: `runoak -i sqlite:obo:mondo mappings 'Marfan syndrome'`
|
||||||
|
* tree (is-a only): `runoak -i sqlite:obo:cl tree -p i CL:0000540`
|
||||||
|
* metadata: `runoak -i sqlite:obo:chebi term-metdata CHEBI:35235`
|
||||||
|
* Complex queries
|
||||||
|
* subclasses: `runoak -i sqlite:obo:cl info .sub CL:0000540 | head`
|
||||||
|
* disjunctions (OR): `runoak -i sqlite:obo:cl info .sub neuron .sub 'T cell' | tail`
|
||||||
|
* conjunctions: `runoak -i sqlite:obo:cl info .sub neuron .and .desc//p=i,p forebrain` (neurons and is-a/part-of the forebrain)
|
||||||
|
* minus: `runoak -i sqlite:obo:cl info .sub neuron .minus .desc//p=i,p forebrain` (neurons and NOT is-a/part-of the forebrain)
|
||||||
|
* Visualization
|
||||||
|
* `cl viz -p i,p,RO:0002215 'dopaminergic neuron' -o /tmp/dn.png` - subgraph from a CL term.
|
||||||
|
* note that graphviz requires installing og2dot
|
||||||
|
* Subsets
|
||||||
|
* list subsets: `runoak -i sqlite:obo:go subsets` - list all subsets (goslim_prokaryote etc)
|
||||||
|
* terms in subsets: `runoak -i sqlite:obo:go info .in goslim_generic` - all terms in a subset
|
||||||
|
* terms in subsets: `runoak -i sqlite:obo:go info .in goslim_generic .minus .in goslim_prokaryote` - all terms in a subset not in another
|
||||||
|
* Other
|
||||||
|
* `runoak lexmatch --help` for aligning ontologies
|
||||||
|
* `runoak statistics --help` for summary stats
|
||||||
|
## Common Options and Idioms
|
||||||
|
|
||||||
|
### Graphs
|
||||||
|
|
||||||
|
OAK is very graph oriented, following ontologies like GO, CL
|
||||||
|
|
||||||
|
Typically for graph operations you want to operate over only is-a and part-of, so use `-p i,p`
|
||||||
|
|
||||||
|
You can also specify RO/BFO ids.
|
||||||
|
|
||||||
|
E.g.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
runoak -i sqlite:obo:ro info 'capable of'
|
||||||
|
RO:0002215 ! capable of
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cl relationships -p RO:0002215 'dopaminergic neuron'
|
||||||
|
subject predicate object subject_label predicate_label object_label
|
||||||
|
CL:0000700 RO:0002215 GO:0061527 dopaminergic neuron capable of dopamine secretion, neurotransmission
|
||||||
|
```
|
||||||
|
|
||||||
Reference in New Issue
Block a user