hra-api
Version:
The Human Reference Atlas (HRA) API deployed to https://apps.humanatlas.io/api/
672 lines (651 loc) • 303 kB
JavaScript
#!/usr/bin/env node
// src/server/server.js
import { schedule } from "node-cron";
// src/library/shared/utils/add-to-endpoint.js
import toNT from "@rdfjs/to-ntriples";
import stream from "stream-browserify";
function toTripleString(quad) {
const subject = toNT(quad.subject).replace("_:_:", "_:");
const predicate = toNT(quad.predicate).replace("_:_:", "_:");
const object = toNT(quad.object).replace("_:_:", "_:");
return `${subject} ${predicate} ${object} .
`;
}
function* sparqlUpdateIterator(graph, quads) {
yield `
INSERT DATA {
GRAPH <${graph}> {
`;
for (const quad of quads) {
yield toTripleString(quad);
}
yield "}}\n";
}
async function addToEndpoint(graph, quads, endpoint) {
return fetch(endpoint, {
method: "POST",
headers: {
"Content-Type": "application/sparql-update"
},
body: stream.Readable.from(sparqlUpdateIterator(graph, quads))
});
}
// src/library/shared/utils/fetch-linked-data.js
import formats from "@rdfjs/formats-common";
import { isReadableStream } from "is-stream";
import jsonld from "jsonld";
import patchResponse from "nodeify-fetch/lib/patchResponse.browser.js";
var EXTENSION_MAPPING = {
"json-ld": "application/ld+json",
jsonld: "application/ld+json",
json: "application/ld+json",
nt: "application/n-triples",
nq: "application/n-quads",
n3: "text/n3",
owl: "application/rdf+xml",
rdf: "application/rdf+xml",
xml: "application/rdf+xml",
trig: "application/trig",
turtle: "text/turtle",
ttl: "text/turtle",
html: "text/html",
htm: "text/html"
};
async function getQuads(url, preferredFormat = "text/turtle") {
if (typeof url === "string" && url.startsWith("http")) {
const parsers = formats.parsers;
const otherFormats = Array.from(parsers.keys()).filter((k) => k !== preferredFormat).sort().reverse();
const res = await fetch(url, {
headers: new Headers({
accept: [preferredFormat, ...otherFormats].join(", ")
})
});
const type2 = res.headers.get("content-type").split(";")[0];
const extension = EXTENSION_MAPPING[url.split(".").slice(-1)[0]];
const guessedType = parsers.has(type2) ? type2 : parsers.has(extension) ? extension : void 0;
if (type2 === "application/json" || guessedType === "application/ld+json") {
const json = await res.json();
const quads = await jsonld.toRDF(json);
return quads;
} else if (guessedType) {
let body = res.body;
if (!isReadableStream(body)) {
body = patchResponse(res).body;
}
const stream2 = parsers.import(guessedType, body, { baseIRI: url });
const quads = [];
for await (const quad of stream2) {
quads.push(quad);
}
return quads;
} else {
try {
const json = JSON.parse(await res.text());
const quads = await jsonld.toRDF(json);
return quads;
} catch (err) {
console.log(err);
return Promise.reject(new Error(`unknown content type: ${type2}`));
}
}
} else {
try {
const json = typeof url === "string" ? JSON.parse(url) : url;
const quads = await jsonld.toRDF(json);
return quads;
} catch (err) {
return Promise.reject(new Error(`unknown content type: ${type}`));
}
}
}
// src/library/shared/utils/sparql.js
import jsonld2 from "jsonld";
import Papa from "papaparse";
jsonld2.documentLoader = async (documentUrl) => {
const document = await fetch(documentUrl).then((r) => r.json());
return {
contextUrl: null,
document,
documentUrl
};
};
function fetchSparql(query, endpoint, mimetype) {
const body = new URLSearchParams({ query });
return fetch(endpoint, {
method: "POST",
headers: {
Accept: mimetype,
"Content-Type": "application/x-www-form-urlencoded",
"Content-Length": body.toString().length.toString()
},
body
});
}
async function select(query, endpoint) {
const resp = await fetchSparql(query, endpoint, "text/csv");
const text = await resp.text();
const { data } = Papa.parse(text, { header: true, skipEmptyLines: true, dynamicTyping: true });
return data || [];
}
async function construct(query, endpoint, frame = void 0) {
const resp = await fetchSparql(query, endpoint, "application/ld+json");
const json = await resp.json();
if (frame) {
return await jsonld2.frame(json, frame);
} else {
return json;
}
}
async function update(updateQuery, endpoint) {
return fetch(endpoint, {
method: "POST",
headers: {
"Content-Type": "application/sparql-update"
},
body: updateQuery
});
}
async function deleteGraphs(graphs, endpoint) {
const updateQuery = graphs.map((graph) => `CLEAR GRAPH <${graph}>;`).join("\n");
return update(updateQuery, endpoint);
}
// src/library/shared/utils/named-graphs.js
var QUERY = "SELECT DISTINCT ?g WHERE { GRAPH ?g { ?s ?p ?o . } }";
async function namedGraphs(endpoint) {
const graphs = await select(QUERY, endpoint);
return new Set(graphs.map((graph) => graph.g));
}
// src/library/shared/utils/ensure-named-graphs.js
async function ensureNamedGraphs(graphsToCheck, endpoint) {
const graphs = new Set(await namedGraphs(endpoint));
let updateQuery = "";
for (const graphAndUrl of graphsToCheck) {
const graph = graphAndUrl.split("@@")[0];
const url = graphAndUrl.split("@@").slice(-1)[0];
if (!graphs.has(graph)) {
console.log((/* @__PURE__ */ new Date()).toISOString(), "Adding named graph:", graph);
updateQuery += `
CLEAR GRAPH <${graph}>;
LOAD <${url}> INTO GRAPH <${graph}>;
`;
graphs.add(graph);
}
}
await update(updateQuery, endpoint);
return graphs;
}
// src/library/v1/queries/ds-graph-enrichment.rq
var ds_graph_enrichment_default = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\nPREFIX rdfs: <http://www.w3\
.org/2000/01/rdf-schema#>\nPREFIX owl: <http://www.w3.org/2002/07/owl#>\nPREFIX ccf: <http://purl.org/ccf/>\nPREFIX HRA: <h\
ttps://purl.humanatlas.io/collection/hra-api>\nPREFIX DSGraphs: <https://purl.humanatlas.io/collection/ds-graphs>\nPREFIX \
DSGraphsExtra: <https://purl.humanatlas.io/graph/ds-graphs-enrichments>\nPREFIX has_characterizing_biomarker_set: <http:/\
/purl.obolibrary.org/obo/RO_0015004>\n\nINSERT {\n GRAPH DSGraphsExtra: {\n ?rui_location ccf:collides_with ?anatomical_\
structure ;\n ccf:collides_with ?as_parent ;\n ccf:collides_with_ct ?cell_type ;\n ccf:collides_with_bm ?bio\
marker .\n }\n}\nUSING HRA:\nUSING DSGraphs:\nUSING NAMED DSGraphsExtra:\nWHERE {\n {\n [] ccf:has_registration_location ?r\
ui_location .\n ?rui_location rdf:type ccf:SpatialEntity .\n\n FILTER NOT EXISTS {\n GRAPH DSGraphsExtra: {\n \
?rui_location ccf:collides_with [] .\n }\n }\n }\n\n {\n ?rui_location ccf:collides_with ?anatomical_structure\
.\n }\n UNION\n {\n [] rdf:type ccf:SpatialPlacement ;\n ccf:placement_relative_to ?refOrgan ;\n ccf:plac\
ement_for ?rui_location .\n\n {\n ?refOrgan ccf:representation_of ?anatomical_structure .\n }\n UNION\n {\n \
?refOrgan owl:sameAs [\n ccf:representation_of ?anatomical_structure ;\n ] .\n }\n }\n\n # Manually add pa\
ired organ parents\n OPTIONAL {\n VALUES (?as_parent ?anatomical_structure) {\n # Lymph Node\n (<http://purl.o\
bolibrary.org/obo/UBERON_0000029> <http://purl.obolibrary.org/obo/UBERON_0002509>)\n # Eye\n (<http://purl.oboli\
brary.org/obo/UBERON_0000970> <http://purl.obolibrary.org/obo/UBERON_0004548>)\n (<http://purl.obolibrary.org/obo/UB\
ERON_0000970> <http://purl.obolibrary.org/obo/UBERON_0004549>)\n # Fallopian Tube\n (<http://purl.obolibrary.org\
/obo/UBERON_0003889> <http://purl.obolibrary.org/obo/UBERON_0001303>)\n (<http://purl.obolibrary.org/obo/UBERON_0003\
889> <http://purl.obolibrary.org/obo/UBERON_0001302>)\n # Kidney\n (<http://purl.obolibrary.org/obo/UBERON_00021\
13> <http://purl.obolibrary.org/obo/UBERON_0004538>)\n (<http://purl.obolibrary.org/obo/UBERON_0002113> <http://purl\
.obolibrary.org/obo/UBERON_0004539>)\n # Knee\n (<http://purl.obolibrary.org/obo/UBERON_0001465> <http://purl.or\
g/sig/ont/fma/fma24978>)\n (<http://purl.obolibrary.org/obo/UBERON_0001465> <http://purl.org/sig/ont/fma/fma24977>)\n\
# Mammary Gland\n (<http://purl.obolibrary.org/obo/UBERON_0001911> <http://purl.org/sig/ont/fma/fma57991>)\n \
(<http://purl.obolibrary.org/obo/UBERON_0001911> <http://purl.org/sig/ont/fma/fma57987>)\n # Ovary\n (<http:/\
/purl.obolibrary.org/obo/UBERON_0000992> <http://purl.obolibrary.org/obo/UBERON_0002119>)\n (<http://purl.obolibrary\
.org/obo/UBERON_0000992> <http://purl.obolibrary.org/obo/UBERON_0002118>)\n # Palatine Tonsil\n (<http://purl.ob\
olibrary.org/obo/UBERON_0002373> <http://purl.org/sig/ont/fma/fma54974>)\n (<http://purl.obolibrary.org/obo/UBERON_0\
002373> <http://purl.org/sig/ont/fma/fma54973>)\n # Renal Pelvis\n (<http://purl.obolibrary.org/obo/UBERON_00012\
24> <http://purl.obolibrary.org/obo/UBERON_0018116>)\n (<http://purl.obolibrary.org/obo/UBERON_0001224> <http://purl\
.obolibrary.org/obo/UBERON_0018115>)\n # Ureter\n (<http://purl.obolibrary.org/obo/UBERON_0000056> <http://purl.\
obolibrary.org/obo/UBERON_0001223>)\n (<http://purl.obolibrary.org/obo/UBERON_0000056> <http://purl.obolibrary.org/o\
bo/UBERON_0001222>)\n # Lung (Edge case: we have reversed the relationship between lung and respiratory system for r\
easons)\n (<http://purl.obolibrary.org/obo/UBERON_0002048> <http://purl.obolibrary.org/obo/UBERON_0001004>)\n (<\
http://purl.obolibrary.org/obo/UBERON_0001004> <http://purl.obolibrary.org/obo/UBERON_0002048>)\n }\n \n OPTIONAL \
{\n ?parent_descriptor rdf:type ccf:CellMarkerDescriptor ;\n ccf:primary_anatomical_structure\
?as_parent ;\n ccf:primary_cell_type ?cell_type .\n OPTIONAL {\n ?parent_descriptor cc\
f:biomarker ?biomarker .\n }\n }\n }\n\n OPTIONAL {\n ?descriptor rdf:type ccf:CellMarkerDescriptor ;\n \
ccf:primary_anatomical_structure ?anatomical_structure ;\n ccf:primary_cell_type ?cell_type .\n OPT\
IONAL {\n ?descriptor ccf:biomarker ?biomarker .\n }\n }\n}\n";
// src/library/v1/queries/get-dataset-info.rq
var get_dataset_info_default = "PREFIX hraApi: <urn:hra-api#>\nPREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n\
PREFIX schema: <http://schema.org/>\nPREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\nPREFIX DSGraphs: <urn:hra-api:TOKEN:\
ds-info>\n\nSELECT ?status ?message ?checkback ?loadTime ?timestamp ?startTime\nFROM DSGraphs:\nWHERE {\n DSGraphs: a hraApi\
:Dataset ;\n hraApi:status ?status ;\n hraApi:message ?message ;\n hraApi:startTime ?startTime ;\n hraApi:update\
Time ?updateTime ;\n\n BIND(IF(?status = 'Ready' || ?status = 'Error', 60 * 60 * 1000, 2000) as ?checkback)\n BIND(STR(?u\
pdateTime) as ?timestamp)\n}\n";
// src/library/v1/queries/prunable-datasets.rq
var prunable_datasets_default = `PREFIX hraApi: <urn:hra-api#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT DISTINCT ?age ?maxAge ?dsInfo ?dsGraph ?status ?updateTime
WHERE {
GRAPH ?dsInfo {
?dsInfo a hraApi:Dataset ;
hraApi:namedGraph ?dsGraph ;
hraApi:status ?status ;
hraApi:updateTime ?updateTime .
# Max dataset age is currently set to 24 hours
BIND((xsd:dateTime("2001-01-02T00:00:00Z") - xsd:dateTime("2001-01-01T00:00:00Z")) as ?maxAge)
BIND(NOW() - ?updateTime as ?age)
FILTER((NOW() - ?updateTime) > ?maxAge || ?status = 'Error')
}
}
`;
// src/library/v1/queries/start-dataset-info.rq
var start_dataset_info_default = 'PREFIX hraApi: <urn:hra-api#>\nPREFIX schema: <http://schema.org/>\nPREFIX DSGraphInfo: \
<urn:hra-api:TOKEN:ds-info>\nPREFIX DSGraph: <urn:hra-api:TOKEN:ds-graph>\n\nWITH DSGraphInfo:\nDELETE {\n DSGraphInfo: a hr\
aApi:Dataset ;\n ?key ?value .\n}\nINSERT {\n DSGraphInfo: a hraApi:Dataset ;\n hraApi:status "Loading" ;\n hraApi:m\
essage "Job is queued to be run..." ;\n hraApi:namedGraph DSGraph: ;\n hraApi:startTime ?startTime ;\n hraApi:upda\
teTime ?startTime ;\n}\nWHERE {\n OPTIONAL {\n DSGraphInfo: a hraApi:Dataset ;\n ?key ?value .\n }\n BIND(NOW() as ?\
startTime)\n}\n';
// src/library/v1/queries/update-dataset-info.rq
var update_dataset_info_default = 'PREFIX hraApi: <urn:hra-api#>\nPREFIX schema: <http://schema.org/>\nPREFIX DSGraphs: <u\
rn:hra-api:TOKEN:ds-info>\n\nWITH DSGraphs:\nDELETE {\n DSGraphs: a hraApi:Dataset ;\n hraApi:status ?status ;\n hraApi\
:message ?message ;\n hraApi:updateTime ?updateTime .\n}\nINSERT {\n DSGraphs: a hraApi:Dataset ;\n hraApi:status ?new\
Status ;\n hraApi:message ?newMessage ;\n hraApi:updateTime ?newUpdateTime .\n}\nWHERE {\n OPTIONAL {\n DSGraphs: a \
hraApi:Dataset ;\n hraApi:status ?status ;\n hraApi:message ?message ;\n hraApi:updateTime ?updateTime .\n }\
\n\n BIND("{{STATUS}}" as ?newStatus)\n BIND("{{MESSAGE}}" as ?newMessage)\n BIND(NOW() as ?newUpdateTime)\n}\n';
// src/library/v1/utils/dataset-graph.js
var DEFAULT_GRAPHS = [
"https://purl.humanatlas.io/collection/hra-api@@https://cdn.humanatlas.io/digital-objects/collection/hra-api/latest/gr\
aph.ttl",
"https://purl.humanatlas.io/graph/hra-ccf-patches@@https://cdn.humanatlas.io/digital-objects/graph/hra-ccf-patches/lat\
est/graph.ttl",
"https://purl.humanatlas.io/graph/hra-pop@@https://cdn.humanatlas.io/digital-objects/graph/hra-pop/latest/graph.ttl",
"https://purl.humanatlas.io/collection/ds-graphs@@https://cdn.humanatlas.io/digital-objects/collection/ds-graphs/lates\
t/graph.ttl",
"https://purl.humanatlas.io/graph/ds-graphs-enrichments@@https://cdn.humanatlas.io/digital-objects/graph/ds-graphs-enr\
ichments/latest/graph.ttl"
];
async function initializeDatasetGraph(token, _request, endpoint) {
const updateQuery = start_dataset_info_default.replace("urn:hra-api:TOKEN:ds-info", `urn:hra-api:${token}:ds-info`).replace(
"urn:hra-api:TOKEN:ds-graph", `urn:hra-api:${token}:ds-graph`);
await update(updateQuery, endpoint);
}
async function updateDatasetInfo(status, message, token, endpoint) {
console.log((/* @__PURE__ */ new Date()).toISOString(), token, status, message);
const updateQuery = update_dataset_info_default.replace("urn:hra-api:TOKEN:ds-info", `urn:hra-api:${token}:ds-info`).replace(
"{{STATUS}}", status).replace("{{MESSAGE}}", message);
return update(updateQuery, endpoint);
}
async function getDatasetInfo(token, endpoint) {
const infoQuery = get_dataset_info_default.replace("urn:hra-api:TOKEN:ds-info", `urn:hra-api:${token}:ds-info`);
const status = await select(infoQuery, endpoint);
const results = status.length > 0 ? status[0] : {
status: "Error",
message: "Unknown error while loading database",
checkback: 36e5,
loadTime: 22594,
timestamp: (/* @__PURE__ */ new Date()).toISOString()
};
results.loadTime = results.loadTime || (results.status === "Loading" ? /* @__PURE__ */ new Date() : new Date(results.timestamp)) -
new Date(results.startTime);
return results;
}
async function createDatasetGraph(token, request, endpoint) {
try {
const graphs = await ensureNamedGraphs(DEFAULT_GRAPHS, endpoint);
const dsGraph = `urn:hra-api:${token}:ds-graph`;
const dsGraphEnrichments = `urn:hra-api:${token}:ds-graph-enrichments`;
if (!graphs.has(dsGraph)) {
for (const source of request.dataSources) {
await updateDatasetInfo("Loading", `Adding dataset`, token, endpoint);
const quads = await getQuads(source);
await addToEndpoint(dsGraph, quads, endpoint);
}
await updateDatasetInfo("Loading", `Enriching dataset`, token, endpoint);
await enrichDatasetGraph(dsGraph, dsGraphEnrichments, endpoint);
}
await updateDatasetInfo("Ready", `Dataset ready`, token, endpoint);
} catch (err) {
console.error("ERROR", token, request, endpoint, err);
await updateDatasetInfo("Error", `Error processing dataset`, token, endpoint);
}
}
async function enrichDatasetGraph(dsGraph, dsGraphEnrichments, endpoint) {
const updateQuery = ds_graph_enrichment_default.replace("PREFIX DSGraphs: <https://purl.humanatlas.io/collection/ds-gr\
aphs>", `PREFIX DSGraphs: <${dsGraph}>`).replace(
"PREFIX DSGraphsExtra: <https://purl.humanatlas.io/graph/ds-graphs-enrichments>",
`PREFIX DSGraphsExtra: <${dsGraphEnrichments}>`
);
const result = await update(updateQuery, endpoint);
if (!result.ok) {
console.log("error enriching", dsGraph, "code:", result.status);
console.error(await result.text());
}
return result;
}
async function pruneDatasetGraphs(endpoint) {
const datasets = await select(prunable_datasets_default, endpoint);
console.log(datasets.length, "datasets to prune");
if (datasets.length > 0) {
const graphs = datasets.reduce((acc, row) => acc.concat([row.dsInfo, row.dsGraph]), []);
console.log("deleting", graphs);
for (const graph of graphs) {
await deleteGraphs([graph], endpoint);
}
}
}
// src/server/app.js
import cors from "cors";
import express from "express";
import queue from "express-queue";
import helmet from "helmet";
import qs from "qs";
// src/server/cache-middleware.js
import { existsSync } from "fs";
import { resolve } from "path";
// src/server/environment.js
var DEFAULT_SPARQL_ENDPOINT = "https://lod.humanatlas.io/sparql";
function sparqlEndpoint() {
return process.env.SPARQL_ENDPOINT ?? DEFAULT_SPARQL_ENDPOINT;
}
function isWritable() {
return process.env.SPARQL_WRITABLE === "true";
}
function exposedSparqlEndpoint() {
return process.env.EXPOSED_SPARQL_ENDPOINT ?? (isWritable() ? DEFAULT_SPARQL_ENDPOINT : sparqlEndpoint());
}
function port() {
return process.env.PORT || 3e3;
}
function shortCacheTimeout() {
return process.env.CACHE_TIMEOUT || 3600;
}
function pruningSchedule() {
return process.env.PRUNING_SCHEDULE || "0 6 * * *";
}
function longCacheTimeout() {
return process.env.LONG_CACHE_TIMEOUT || shortCacheTimeout() * 24;
}
function activeQueryLimit() {
return process.env.ACTIVE_QUERIES || 4;
}
function cacheDir() {
return process.env.FILE_CACHE_DIR || "./file-cache";
}
// src/server/cache-middleware.js
function cache(ttl = shortCacheTimeout(), revalidateTtl = 600, errorTtl = 600) {
return (_req, res, next) => {
res.setHeader(
"Cache-Control",
`public, max-age=${ttl}, stale-while-revalidate=${revalidateTtl}, stale-if-error=${errorTtl}`
);
next();
};
}
var longCache = cache(longCacheTimeout());
var shortCache = cache(shortCacheTimeout());
function noCache(_req, res, next) {
res.setHeader("Cache-Control", "no-cache");
next();
}
function fileCache(filename) {
const filepath = resolve(cacheDir(), filename);
return async (_req, res, next) => {
if (existsSync(filepath)) {
res.sendFile(filepath, { cacheControl: false });
} else {
next();
}
};
}
// src/server/fetch-polyfill.js
import fetch2, { Headers as Headers2, Request, Response } from "node-fetch";
globalThis.fetch = fetch2;
globalThis.Headers = Headers2;
globalThis.Request = Request;
globalThis.Response = Response;
// src/server/routes/browser.js
import { Router } from "express";
// hra-api-spec.yaml
var hra_api_spec_default = "openapi: 3.0.3\ninfo:\n title: HRA-API\n description: |\n This API provides programmatic ac\
cess to data registered to the Human Reference Atlas (HRA).\n See the [HuBMAP HRA Portal](https://humanatlas.io/) for \
details.\n version: 0.19.0\n contact:\n name: HuBMAP Help Desk\n email: help@hubmapconsortium.org\n license:\n nam\
e: MIT License\n url: https://spdx.org/licenses/MIT.html\nservers:\n - description: HRA-API Production\n url: https:/\
/apps.humanatlas.io/api\n - description: HRA-API Staging\n url: https://apps.humanatlas.io/api--staging\n - descriptio\
n: CCF-API (deprecated) Production\n url: https://apps.humanatlas.io/hra-api\n - description: Local Server\n url: /\n\
security: []\ntags:\n - name: v1\n description: HRA-API v1 Routes\n - name: ds-graph\n description: Dataset Graph Rou\
tes\n - name: hra-kg\n description: HRA KG Routes\n - name: hra-pop\n description: HRApop Routes\nexternalDocs:\n des\
cription: API Documentation\n url: https://github.com/x-atlas-consortia/hra-api#readme\npaths:\n /v1/aggregate-results:\n \
get:\n summary: Get aggregate results / statistics\n operationId: aggregate-results\n tags:\n - v1\n\
parameters:\n - $ref: '#/components/parameters/Age'\n - $ref: '#/components/parameters/AgeRange'\n \
- $ref: '#/components/parameters/Bmi'\n - $ref: '#/components/parameters/BmiRange'\n - $ref: '#/component\
s/parameters/Cache'\n - $ref: '#/components/parameters/OntologyTerms'\n - $ref: '#/components/parameters/Cel\
lTypeTerms'\n - $ref: '#/components/parameters/BiomarkerTerms'\n - $ref: '#/components/parameters/Consortium\
s'\n - $ref: '#/components/parameters/Providers'\n - $ref: '#/components/parameters/Sex'\n - $ref: '#/\
components/parameters/SpatialSearches'\n - $ref: '#/components/parameters/Technologies'\n - $ref: '#/compone\
nts/parameters/Token'\n responses:\n '200':\n $ref: '#/components/responses/AggregateResults'\n \
'404':\n $ref: '#/components/responses/ErrorMessage'\n /v1/anatomical-systems-tree-model:\n get:\n summary\
: Get anatomical systems partonomy tree nodes\n operationId: anatomical-systems-tree-model\n tags:\n - v1\n\
parameters:\n - $ref: '#/components/parameters/Cache'\n - $ref: '#/components/parameters/Token'\n \
responses:\n '200':\n $ref: '#/components/responses/OntologyTree'\n '404':\n $ref: '#/compon\
ents/responses/ErrorMessage'\n /v1/asctb-omap-sheet-config:\n get:\n summary: Get OMAP sheet config data for the A\
SCT+B Reporter\n operationId: asctb-omap-sheet-config\n tags:\n - v1\n responses:\n '200':\n \
$ref: '#/components/responses/AsctbReferenceData'\n '404':\n $ref: '#/components/responses/ErrorMessa\
ge'\n /v1/asctb-sheet-config:\n get:\n summary: Get sheet config data for the ASCT+B Reporter\n operationId: a\
sctb-sheet-config\n tags:\n - v1\n responses:\n '200':\n $ref: '#/components/responses/Asctb\
ReferenceData'\n '404':\n $ref: '#/components/responses/ErrorMessage'\n /v1/biomarker-term-occurences:\n \
get:\n summary: Get number of biomarker type term occurrences for a search\n operationId: biomarker-term-occure\
nces\n tags:\n - v1\n parameters:\n - $ref: '#/components/parameters/Age'\n - $ref: '#/compone\
nts/parameters/AgeRange'\n - $ref: '#/components/parameters/Bmi'\n - $ref: '#/components/parameters/BmiRange\
'\n - $ref: '#/components/parameters/Cache'\n - $ref: '#/components/parameters/OntologyTerms'\n - $ref\
: '#/components/parameters/CellTypeTerms'\n - $ref: '#/components/parameters/BiomarkerTerms'\n - $ref: '#/co\
mponents/parameters/Consortiums'\n - $ref: '#/components/parameters/Providers'\n - $ref: '#/components/param\
eters/Sex'\n - $ref: '#/components/parameters/SpatialSearches'\n - $ref: '#/components/parameters/Technologi\
es'\n - $ref: '#/components/parameters/Token'\n responses:\n '200':\n $ref: '#/components/respon\
ses/TermOccurences'\n '404':\n $ref: '#/components/responses/ErrorMessage'\n /v1/biomarker-tree-model:\n \
get:\n summary: Get biomarker tree nodes\n operationId: biomarker-tree-model\n tags:\n - v1\n par\
ameters:\n - $ref: '#/components/parameters/Cache'\n - $ref: '#/components/parameters/Token'\n responses\
:\n '200':\n $ref: '#/components/responses/OntologyTree'\n '404':\n $ref: '#/components/resp\
onses/ErrorMessage'\n /v1/cell-type-term-occurences:\n get:\n summary: Get number of cell type term occurrences fo\
r a search\n operationId: cell-type-term-occurences\n tags:\n - v1\n parameters:\n - $ref: '#/co\
mponents/parameters/Age'\n - $ref: '#/components/parameters/AgeRange'\n - $ref: '#/components/parameters/Bmi\
'\n - $ref: '#/components/parameters/BmiRange'\n - $ref: '#/components/parameters/Cache'\n - $ref: '#/\
components/parameters/OntologyTerms'\n - $ref: '#/components/parameters/CellTypeTerms'\n - $ref: '#/componen\
ts/parameters/BiomarkerTerms'\n - $ref: '#/components/parameters/Consortiums'\n - $ref: '#/components/parame\
ters/Providers'\n - $ref: '#/components/parameters/Sex'\n - $ref: '#/components/parameters/SpatialSearches'\n\
- $ref: '#/components/parameters/Technologies'\n - $ref: '#/components/parameters/Token'\n responses:\n\
'200':\n $ref: '#/components/responses/TermOccurences'\n '404':\n $ref: '#/components/resp\
onses/ErrorMessage'\n /v1/cell-type-tree-model:\n get:\n summary: Get cell type tree nodes\n operationId: cell\
-type-tree-model\n tags:\n - v1\n parameters:\n - $ref: '#/components/parameters/Cache'\n - $r\
ef: '#/components/parameters/Token'\n responses:\n '200':\n $ref: '#/components/responses/OntologyTree\
'\n '404':\n $ref: '#/components/responses/ErrorMessage'\n /v1/collisions:\n post:\n summary: Given \
an extraction site, get mesh-based collisions with the reference organ.\n operationId: collisions\n tags:\n \
- v1\n requestBody:\n $ref: '#/components/requestBodies/ExtractionSite'\n responses:\n '200':\n \
description: Successful operation\n content:\n application/json:\n schema:\n \
type: array\n items:\n type: object\n additionalProperties: true\n \
'400':\n $ref: '#/components/responses/ErrorMessage'\n '404':\n $ref: '#/components/response\
s/ErrorMessage'\n '500':\n $ref: '#/components/responses/ErrorMessage'\n /v1/consortium-names:\n get:\n \
summary: Get consortium names (for filtering)\n operationId: consortium-names\n tags:\n - v1\n par\
ameters:\n - $ref: '#/components/parameters/Cache'\n - $ref: '#/components/parameters/Token'\n responses\
:\n '200':\n $ref: '#/components/responses/Strings'\n '404':\n $ref: '#/components/responses\
/ErrorMessage'\n /v1/corridor:\n post:\n summary: Given an extraction site, generate a corridor with the reference\
organ.\n operationId: corridor\n tags:\n - v1\n requestBody:\n $ref: '#/components/requestBodie\
s/ExtractionSite'\n responses:\n '200':\n description: Successful operation\n content:\n \
model/gltf-binary:\n schema:\n type: string\n format: binary\n '400':\
\n $ref: '#/components/responses/ErrorMessage'\n '404':\n $ref: '#/components/responses/ErrorMessa\
ge'\n '500':\n $ref: '#/components/responses/ErrorMessage'\n /v1/db-status:\n get:\n summary: Get cu\
rrent status of database\n operationId: db-status\n tags:\n - v1\n parameters:\n - $ref: '#/comp\
onents/parameters/Token'\n responses:\n '200':\n $ref: '#/components/responses/DatabaseStatus'\n \
'404':\n $ref: '#/components/responses/ErrorMessage'\n /v1/ds-graph:\n get:\n summary: Get dataset graph\n\
description: Get potentially filtered experimental data in dataset graph format (previously referred to as rui_loc\
ations.jsonld format)\n operationId: ds-graph\n tags:\n - v1\n parameters:\n - $ref: '#/componen\
ts/parameters/Age'\n - $ref: '#/components/parameters/AgeRange'\n - $ref: '#/components/parameters/Bmi'\n \
- $ref: '#/components/parameters/BmiRange'\n - $ref: '#/components/parameters/Cache'\n - $ref: '#/compon\
ents/parameters/OntologyTerms'\n - $ref: '#/components/parameters/CellTypeTerms'\n - $ref: '#/components/par\
ameters/BiomarkerTerms'\n - $ref: '#/components/parameters/Consortiums'\n - $ref: '#/components/parameters/P\
roviders'\n - $ref: '#/components/parameters/Sex'\n - $ref: '#/components/parameters/SpatialSearches'\n \
- $ref: '#/components/parameters/Technologies'\n - $ref: '#/components/parameters/Token'\n responses:\n \
'200':\n description: Successful operation\n content:\n application/json:\n sche\
ma:\n type: object\n additionalProperties: true\n '404':\n $ref: '#/components\
/responses/ErrorMessage'\n /v1/extraction-site:\n get:\n summary: Lookup Extraction Site\n operationId: extrac\
tion-site\n tags:\n - v1\n parameters:\n - $ref: '#/components/parameters/ExtractionSiteIri'\n r\
esponses:\n '200':\n description: Successful operation\n content:\n application/json:\n \
schema:\n type: object\n additionalProperties: true\n '404':\n $re\
f: '#/components/responses/ErrorMessage'\n /v1/ftu-illustrations:\n get:\n summary: Get 2D FTU Illustration data\n \
operationId: ftu-illustrations\n tags:\n - v1\n responses:\n '200':\n $ref: '#/componen\
ts/responses/FtuIllustrations'\n '404':\n $ref: '#/components/responses/ErrorMessage'\n /v1/get-spatial-pl\
acement:\n post:\n summary: Given a SpatialEntity already placed relative to a reference SpatialEntity, retrieve a\
new direct SpatialPlacement to the given SpatialEntity IRI\n operationId: get-spatial-placement\n tags:\n \
- v1\n requestBody:\n $ref: '#/components/requestBodies/GetSpatialPlacement'\n responses:\n '200':\n\
$ref: '#/components/responses/SpatialPlacement'\n '400':\n $ref: '#/components/responses/ErrorMe\
ssage'\n '404':\n $ref: '#/components/responses/ErrorMessage'\n '500':\n $ref: '#/components\
/responses/ErrorMessage'\n /v1/gtex/rui_locations.jsonld:\n get:\n summary: Get all GTEx rui locations (if enabled\
)\n description: This option is only enabled if GTEX_ROUTES=true in the environment\n operationId: gtex-rui-loca\
tions\n tags:\n - v1\n parameters:\n - $ref: '#/components/parameters/Cache'\n responses:\n \
'200':\n description: Successful operation\n content:\n application/json:\n sche\
ma:\n type: object\n additionalProperties: true\n '404':\n description: Not fo\
und due to option being disabled\n /v1/hubmap/rui_locations.jsonld:\n get:\n summary: Get all hubmap rui locations\
(if enabled)\n description: This option is only enabled if XCONSORTIA_ROUTES=true in the environment\n operatio\
nId: hubmap-rui-locations\n tags:\n - v1\n parameters:\n - $ref: '#/components/parameters/Cache'\n \
- $ref: '#/components/parameters/Token'\n responses:\n '200':\n description: Successful operation\
\n content:\n application/json:\n schema:\n type: object\n add\
itionalProperties: true\n '404':\n description: Not found due to option being disabled\n /v1/mesh-3d-cell-\
population:\n post:\n summary: Given a reference organ, 3d scene node, and cell population, generate cells in tha\
t distribution to fit in that 3d scene node.\n operationId: mesh-3d-cell-population\n tags:\n - v1\n r\
equestBody:\n $ref: '#/components/requestBodies/Mesh3dCellPopulation'\n responses:\n '200':\n de\
scription: Successful response with CSV file\n content:\n text/csv:\n schema:\n \
type: string\n format: binary\n '400':\n $ref: '#/components/responses/ErrorMessage'\n \
'404':\n $ref: '#/components/responses/ErrorMessage'\n '500':\n $ref: '#/components/responses\
/ErrorMessage'\n /v1/ontology-term-occurences:\n get:\n summary: Get number of ontology term occurrences for a sea\
rch\n operationId: ontology-term-occurences\n tags:\n - v1\n parameters:\n - $ref: '#/components\
/parameters/Age'\n - $ref: '#/components/parameters/AgeRange'\n - $ref: '#/components/parameters/Bmi'\n \
- $ref: '#/components/parameters/BmiRange'\n - $ref: '#/components/parameters/Cache'\n - $ref: '#/componen\
ts/parameters/OntologyTerms'\n - $ref: '#/components/parameters/CellTypeTerms'\n - $ref: '#/components/param\
eters/BiomarkerTerms'\n - $ref: '#/components/parameters/Consortiums'\n - $ref: '#/components/parameters/Pro\
viders'\n - $ref: '#/components/parameters/Sex'\n - $ref: '#/components/parameters/SpatialSearches'\n \
- $ref: '#/components/parameters/Technologies'\n - $ref: '#/components/parameters/Token'\n responses:\n \
'200':\n $ref: '#/components/responses/TermOccurences'\n '404':\n $ref: '#/components/responses/Er\
rorMessage'\n /v1/ontology-tree-model:\n get:\n summary: Get ontology term tree nodes\n operationId: ontology-\
tree-model\n tags:\n - v1\n parameters:\n - $ref: '#/components/parameters/Cache'\n - $ref: '#\
/components/parameters/Token'\n responses:\n '200':\n $ref: '#/components/responses/OntologyTree'\n \
'404':\n $ref: '#/components/responses/ErrorMessage'\n /v1/provider-names:\n get:\n summary: Get tissu\
e provider names (for filtering)\n operationId: provider-names\n tags:\n - v1\n parameters:\n - \
$ref: '#/components/parameters/Cache'\n - $ref: '#/components/parameters/Token'\n responses:\n '200':\n \
$ref: '#/components/responses/Strings'\n '404':\n $ref: '#/components/responses/ErrorMessage'\n /v\
1/reference-organ-scene:\n get:\n summary: Get all nodes to form the 3D scene for an organ\n operationId: refe\
rence-organ-scene\n tags:\n - v1\n parameters:\n - $ref: '#/components/parameters/Age'\n - $re\
f: '#/components/parameters/AgeRange'\n - $ref: '#/components/parameters/Bmi'\n - $ref: '#/components/parame\
ters/BmiRange'\n - $ref: '#/components/parameters/Cache'\n - $ref: '#/components/parameters/OntologyTerms'\n \
- $ref: '#/components/parameters/CellTypeTerms'\n - $ref: '#/components/parameters/BiomarkerTerms'\n \
- $ref: '#/components/parameters/OrganIri'\n - $ref: '#/components/parameters/Consortiums'\n - $ref: '#/comp\
onents/parameters/Providers'\n - $ref: '#/components/parameters/Sex'\n - $ref: '#/components/parameters/Spat\
ialSearches'\n - $ref: '#/components/parameters/Technologies'\n - $ref: '#/components/parameters/Token'\n \
responses:\n '200':\n $ref: '#/components/responses/SpatialSceneNodes'\n '400':\n $ref: '#\
/components/responses/ErrorMessage'\n '404':\n $ref: '#/components/responses/ErrorMessage'\n /v1/reference\
-organs:\n get:\n summary: Get all reference organs\n operationId: reference-organs\n tags:\n - v1\n \
parameters:\n - $ref: '#/components/parameters/Cache'\n - $ref: '#/components/parameters/Token'\n r\
esponses:\n '200':\n $ref: '#/components/responses/SpatialEntities'\n '404':\n $ref: '#/comp\
onents/responses/ErrorMessage'\n /v1/rui-reference-data:\n get:\n summary: Get reference data for the RUI tool\n \
operationId: rui-reference-data\n tags:\n - v1\n responses:\n '200':\n $ref: '#/component\
s/responses/RuiReferenceData'\n '404':\n $ref: '#/components/responses/ErrorMessage'\n /v1/scene:\n get:\
\n summary: Get all nodes to form the 3D scene of reference body, organs, and tissues\n operationId: scene\n \
tags:\n - v1\n parameters:\n - $ref: '#/components/parameters/Age'\n - $ref: '#/components/parame\
ters/AgeRange'\n - $ref: '#/components/parameters/Bmi'\n - $ref: '#/components/parameters/BmiRange'\n \
- $ref: '#/components/parameters/Cache'\n - $ref: '#/components/parameters/OntologyTerms'\n - $ref: '#/compo\
nents/parameters/CellTypeTerms'\n - $ref: '#/components/parameters/BiomarkerTerms'\n - $ref: '#/components/p\
arameters/Consortiums'\n - $ref: '#/components/parameters/Providers'\n - $ref: '#/components/parameters/Sex'\
\n - $ref: '#/components/parameters/SpatialSearches'\n - $ref: '#/components/parameters/Technologies'\n \
- $ref: '#/components/parameters/Token'\n responses:\n '200':\n $ref: '#/components/responses/Spatia\
lSceneNodes'\n '404':\n $ref: '#/components/responses/ErrorMessage'\n /v1/sennet/rui_locations.jsonld:\n \
get:\n summary: Get all sennet rui locations (if enabled)\n description: This option is only enabled if XCONSOR\
TIA_ROUTES=true in the environment\n operationId: sennet-rui-locations\n tags:\n - v1\n parameters:\n \
- $ref: '#/components/parameters/Cache'\n - $ref: '#/components/parameters/Token'\n responses:\n '\
200':\n description: Successful operation\n content:\n application/json:\n schema:\
\n type: object\n additionalProperties: true\n '404':\n description: Not found\
due to option being disabled\n /v1/session-token:\n post:\n summary: Get a session token\n operationId: sessi\
on-token\n tags:\n - v1\n requestBody:\n $ref: '#/components/requestBodies/SessionToken'\n respo\
nses:\n '200':\n $ref: '#/components/responses/SessionToken'\n '404':\n $ref: '#/components/\
responses/ErrorMessage'\n '405':\n $ref: '#/components/responses/ErrorMessage'\n /v1/sparql:\n get:\n \
summary: Run a SPARQL query\n operationId: sparql\n tags:\n - v1\n parameters:\n - $ref: '#/co\
mponents/parameters/Query'\n - $ref: '#/components/parameters/Token'\n - $ref: '#/components/parameters/Form\
at'\n responses:\n '200':\n $ref: '#/components/responses/SparqlResponse'\n '404':\n $re\
f: '#/components/responses/ErrorMessage'\n post:\n summary: Run a SPARQL query (POST)\n operationId: sparql-po\
st\n tags:\n - v1\n requestBody:\n $ref: '#/components/requestBodies/SparqlQuery'\n parameters:\n\
- $ref: '#/components/parameters/Token'\n - $ref: '#/components/parameters/Format'\n responses:\n \
'200':\n $ref: '#/components/responses/SparqlResponse'\n '404':\n $ref: '#/components/responses/\
ErrorMessage'\n /v1/technology-names:\n get:\n summary: Get technology names (for filtering)\n operationId: te\
chnology-names\n tags:\n - v1\n parameters:\n - $ref: '#/components/parameters/Cache'\n - $ref\
: '#/components/parameters/Token'\n responses:\n '200':\n $ref: '#/components/responses/Strings'\n \
'404':\n $ref: '#/components/responses/ErrorMessage'\n /v1/tissue-blocks:\n get:\n summary: Get Tissue \
Block Results\n operationId: tissue-blocks\n tags:\n - v1\n parameters:\n - $ref: '#/components/\
parameters/Age'\n - $ref: '#/components/parameters/AgeRange'\n - $ref: '#/components/parameters/Bmi'\n \
- $ref: '#/components/parameters/BmiRange'\n - $ref: '#/components/parameters/Cache'\n - $ref: '#/component\
s/parameters/OntologyTerms'\n - $ref: '#/components/parameters/CellTypeTerms'\n - $ref: '#/components/parame\
ters/BiomarkerTerms'\n - $ref: '#/components/parameters/Consortiums'\n - $ref: '#/components/parameters/Prov\
iders'\n - $ref: '#/components/parameters/Sex'\n - $ref: '#/components/parameters/SpatialSearches'\n -\
$ref: '#/components/parameters/Technologies'\n - $ref: '#/components/parameters/Token'\n responses:\n '\
200':\n $ref: '#/components/responses/TissueBlocks'\n '404':\n $ref: '#/components/responses/Error\
Message'\n /ds-graph/atlas-d2k:\n get:\n summary: Get Atlas D2K Dataset Graph\n operationId: atlas-d2k\n t\
ags:\n - ds-graph\n parameters:\n - $ref: '#/components/parameters/Token'\n responses:\n '200'\
:\n description: Successful operation\n content:\n application/json:\n schema:\n \
type: object\n additionalProperties: true\n '404':\n $ref: '#/components/respon\
ses/ErrorMessage'\n /ds-graph/gtex:\n get:\n summary: Get GTEx Dataset Graph\n operationId: gtex\n tags:\n \
- ds-graph\n parameters:\n - $ref: '#/components/parameters/Token'\n responses:\n '200':\n \
description: Successful operation\n content:\n application/json:\n schema:\n \
type: object\n additionalProperties: true\n '404':\n $ref: '#/components/responses/Er\
rorMessage'\n /ds-graph/hubmap:\n get:\n summary: Get HuBMAP Dataset Graph\n operationId: hubmap\n tags:\n \
- ds-graph\n parameters:\n - $ref: '#/components/parameters/Token'\n - $ref: '#/components/parame\
ters/Primary'\n responses:\n '200':\n description: Successful operation\n content:\n \
application/json:\n schema:\n type: object\n additionalProperties: true\n \
'404':\n $ref: '#/components/responses/ErrorMessage'\n /ds-graph/sennet:\n get:\n summary: Get SenNet Dat\
aset Graph\n operationId: sennet\n tags:\n - ds-graph\n parameters:\n - $ref: '#/components/para\
meters/Token'\n - $ref: '#/components/parameters/Primary'\n responses:\n '200':\n description: S\
uccessful operation\n content:\n application/json:\n schema:\n type: object\n\
additionalProperties: true\n '404':\n $ref: '#/components/responses/ErrorMessage'\n /hra-p\
op/cell-summary-report:\n post:\n summary: Given a cell summary in csv format, retrieve a predicted cell summary r\
eport from HRApop showing relative anatomical structures, datasets, and rui locations.\n operationId: cell-summary-r\
eport\n tags:\n - hra-pop\n requestBody:\n $ref: '#/components/requestBodies/GetCellSummaryReport'\n \
responses:\n '200':\n $ref: '#/components/responses/CellSummaryReportResponse'\n '400':\n \
$ref: '#/components/responses/ErrorMessage'\n '404':\n $ref: '#/components/responses/ErrorMessage'\n \
'500':\n $ref: '#/components/responses/ErrorMessage'\n /hra-pop/rui-location-cell-summary:\n post:\n s\
ummary: Given a SpatialEntity already placed relative to a reference SpatialEntity, retrieve a predicted cell summary fr\
om HRApop\n operationId: rui-location-cell-summary\n tags:\n - hra-pop\n requestBody:\n $ref: '#\
/components/requestBodies/GetRuiLocationCellSummary'\n responses:\n '200':\n $ref: '#/components/respo\
nses/RuiLocationCellSummaryResponse'\n '400':\n $ref: '#/components/responses/ErrorMessage'\n '404':\
\n $ref: '#/components/responses/ErrorMessage'\n '500':\n $ref: '#/components/responses/ErrorMessa\
ge'\n /hra-pop/supported-organs:\n get:\n summary: Get all organs supported by HRApop\n operationId: supported\
-organs\n tags:\n - hra-pop\n responses:\n '200':\n $ref: '#/components/responses/IdLabelsRe\
sponse'\n '404':\n $ref: '#/components/responses/ErrorMessage'\n '500':\n $ref: '#/component\
s/responses/ErrorMessage'\n /hra-pop/supported-reference-organs:\n get:\n summary: Get all reference organs suppor\
ted by HRApop\n operationId: supported-reference-organs\n tags:\n - hra-pop\n responses:\n '200'\
:\n $ref: '#/components/responses/IdLabelsResponse'\n '404':\n $ref: '#/components/responses/Error\
Message'\n '500':\n $ref: '#/components/responses/ErrorMessage'\n /hra-pop/supported-tools:\n get:\n \
summary: Get all tools supported by HRApop\n operationId: supported-tools\n tags:\n - hra-pop\n respo\
nses:\n '200':\n $ref: '#/components/responses/IdLabelsResponse'\n '404':\n $ref: '#/compone\
nts/responses/ErrorMessage'\n '500':\n $ref: '#/components/responses/ErrorMessage'\n /kg/asctb-term-occure\
nces:\n get:\n summary: Get number of ASCT+B term occurrences for a search\n operationId: asctb-term-occurence\
s\n tags:\n - hra-kg\n parameters:\n - $ref: '#/components/parameters/OntologyTerms'\n - $ref:\
'#/components/parameters/CellTypeTerms'\n - $ref: '#/components/parameters/BiomarkerTerms'\n responses:\n \
'200':\n $ref: '#/components/responses/TermOccurences'\n '404':\n $ref: '#/components/responses\
/ErrorMessage'\n /kg/digital-objects:\n get:\n summary: List all digital objects in the HRA KG\n operationId: \
digital-objects\n tags:\n - hra-kg\n responses:\n '200':\n $ref: '#/components/responses/Dig\
italObjectsResponse'\n '404':\n $ref: '#/components/responses/ErrorMessage'\n '500':\n $ref:\
'#/components/responses/ErrorMessage'\n /kg/do-search:\n get:\n summary: Search for Digital Object PURLs\n op\
erationId: do-search\n tags:\n - hra-kg\n parameters:\n - $ref: '#/components/parameters/OntologyTer\
ms'\n - $ref: '#/components/parameters/CellTypeTerms'\n - $ref: '#/components/parameters/BiomarkerTerms'\n \
- $ref: '#/components/parameters/HraVersions'\n responses:\n '200':\n $ref: '#/components/respons\
es/Strings'\n '404':\n $ref: '#/components/responses/ErrorMessage'\n '500':\n $ref: '#/compo\
nents/responses/ErrorMessage'\ncomponents:\n schemas:\n MinMax:\n title: Number Range\n description: |\n \
Represents a range of numbers using a minimum and maximum.\n Either end may be omitted to indicate an unlimited/in\
finite range in that direction.\n `min` should be less than or equal to `max` but this is not strictly enforced.\n \
type: object\n properties:\n min:\n type: number\n max:\n type: number\n SpatialS\
earch:\n title: Probing Sphere\n description: |\n Specification for a Spatial Search via Probing Sphere\n \
type: object\n properties:\n x:\n title: X coordinate relative to target in millimeters\n \
type: number\n 'y':\n title: Y coordinate relative to target in millimeters\n type: number\n \
z:\n title: Z coordinate relative to target in millimeters\n type: number\n radius:\n tit\
le: Size of the probing sphere in millimeters\n type: number\n target:\n title: The target spatial\
entity IRI\n type: string\n required:\n - x\n - 'y'\n - z\n - radius\n - targ\
et\n additionalProperties: false\n AggregateCount:\n title: Aggregated Count \\w Label\n type: object\n \
required:\n - label\n - count\n properties:\n label:\n title: Aggregate Name/Field\n \
type: string\n count:\n title: AggregatedCountValue\n type: number\n ErrorMessage:\n tit\
le: Error Message\n oneOf:\n - type: string\n title: Error message\n description: Human readab\
le description of the error\n - type: object\n title: ErrorMessageObject\n required:\n -\
error