diff --git a/src/cache_handler.ts b/src/cache_handler.ts index 5b3bbbc7..a52c6d1f 100644 --- a/src/cache_handler.ts +++ b/src/cache_handler.ts @@ -9,7 +9,7 @@ import chunker from 'stream-chunker'; import { Readable, Transform } from 'stream'; import { Record, RecordPackage } from '@biothings-explorer/api-response-transform'; import { threadId } from 'worker_threads'; -import MetaKG from '../../smartapi-kg/built'; +import MetaKG from '@biothings-explorer/smartapi-kg'; import QEdge from './query_edge'; import { QueryHandlerOptions } from '@biothings-explorer/types'; @@ -113,7 +113,7 @@ export default class CacheHandler { } async categorizeEdges(qEdges: QEdge[]): Promise<{ cachedRecords: Record[]; nonCachedQEdges: QEdge[] }> { - if (this.cacheEnabled === false || process.env.INTERNAL_DISABLE_REDIS === "true") { + if (this.cacheEnabled === false || process.env.INTERNAL_DISABLE_REDIS === 'true') { return { cachedRecords: [], nonCachedQEdges: qEdges, @@ -210,7 +210,7 @@ export default class CacheHandler { } async cacheEdges(queryRecords: Record[]): Promise { - if (this.cacheEnabled === false || process.env.INTERNAL_DISABLE_REDIS === "true") { + if (this.cacheEnabled === false || process.env.INTERNAL_DISABLE_REDIS === 'true') { if (global.parentPort) { global.parentPort.postMessage({ threadId, cacheDone: true }); } @@ -257,8 +257,8 @@ export default class CacheHandler { resolve(); }); }); - if (process.env.QEDGE_CACHE_TIME_S !== "0") { - await redisClient.client.expireTimeout(redisID, process.env.QEDGE_CACHE_TIME_S || 1800); + if (process.env.QEDGE_CACHE_TIME_S !== '0') { + await redisClient.client.expireTimeout(redisID, process.env.QEDGE_CACHE_TIME_S || 1800); } } catch (error) { failedHashes.push(hash); diff --git a/src/graph/graph.ts b/src/graph/graph.ts index 018a096b..5227594d 100644 --- a/src/graph/graph.ts +++ b/src/graph/graph.ts @@ -4,8 +4,8 @@ import Debug from 'debug'; import { LogEntry, StampedLog } from '@biothings-explorer/utils'; import KGNode from './kg_node'; import KGEdge from './kg_edge'; -import { Record } from '../../../api-response-transform/built'; -import { TrapiAuxiliaryGraph, TrapiResult } from '../types'; +import { Record } from '@biothings-explorer/api-response-transform'; +import { TrapiAuxiliaryGraph, TrapiResult } from '@biothings-explorer/types'; import KnowledgeGraph from './knowledge_graph'; const debug = Debug('bte:biothings-explorer-trapi:Graph'); @@ -104,6 +104,12 @@ export default class BTEGraph { .map((item) => { this.edges[recordHash].addAdditionalAttributes(item, record.mappedResponse[item]); }); + if (record.knowledge_level) { + this.edges[recordHash].addAdditionalAttributes('biolink:knowledge_level', record.knowledge_level); + } + if (record.agent_type) { + this.edges[recordHash].addAdditionalAttributes('biolink:agent_type', record.agent_type); + } this.edges[recordHash].addSource(record.provenanceChain); Object.entries(record.qualifiers).forEach(([qualifierType, qualifier]) => { this.edges[recordHash].addQualifier(qualifierType, qualifier); diff --git a/src/graph/kg_edge.ts b/src/graph/kg_edge.ts index d6422ab4..797c82f1 100644 --- a/src/graph/kg_edge.ts +++ b/src/graph/kg_edge.ts @@ -1,5 +1,5 @@ -import { ProvenanceChainItem } from '@biothings-explorer/api-response-transform'; -import { TrapiAttribute } from '../types'; +import { TrapiSource } from '@biothings-explorer/types'; +import { TrapiAttribute } from '@biothings-explorer/types'; export interface KGEdgeInfo { object: string; @@ -20,6 +20,7 @@ export default class KGEdge { resource_id: string; resource_role: string; upstream_resource_ids?: Set; + source_record_urls?: Set; }; }; }; @@ -68,7 +69,7 @@ export default class KGEdge { }); } - addSource(source: ProvenanceChainItem | ProvenanceChainItem[]): void { + addSource(source: TrapiSource | TrapiSource[]): void { if (typeof source === 'undefined') { return; } @@ -77,19 +78,26 @@ export default class KGEdge { } source.forEach((item) => { if (!this.sources[item.resource_id]) this.sources[item.resource_id] = {}; + if (item.upstream_resource_ids && !Array.isArray(item.upstream_resource_ids)) { + item.upstream_resource_ids = [item.upstream_resource_ids]; + } + if (item.source_record_urls && !Array.isArray(item.source_record_urls)) { + item.source_record_urls = [item.source_record_urls]; + } if (!this.sources[item.resource_id][item.resource_role]) { this.sources[item.resource_id][item.resource_role] = { resource_id: item.resource_id, resource_role: item.resource_role, upstream_resource_ids: item.upstream_resource_ids ? new Set(item.upstream_resource_ids) : undefined, + source_record_urls: item.source_record_urls ? new Set(item.source_record_urls) : undefined, }; } - if (item.upstream_resource_ids && !Array.isArray(item.upstream_resource_ids)) { - item.upstream_resource_ids = [item.upstream_resource_ids]; - } item.upstream_resource_ids?.forEach((upstream) => this.sources[item.resource_id][item.resource_role].upstream_resource_ids.add(upstream), ); + item.source_record_urls?.forEach((url) => + this.sources[item.resource_id][item.resource_role].source_record_urls.add(url), + ); }); } diff --git a/src/graph/kg_node.ts b/src/graph/kg_node.ts index cf16dfeb..60dac19f 100644 --- a/src/graph/kg_node.ts +++ b/src/graph/kg_node.ts @@ -1,4 +1,4 @@ -import { TrapiAttribute } from '../types'; +import { TrapiAttribute } from '@biothings-explorer/types'; export interface KGNodeInfo { label: string; diff --git a/src/graph/knowledge_graph.ts b/src/graph/knowledge_graph.ts index 0ac539cd..58b621cb 100644 --- a/src/graph/knowledge_graph.ts +++ b/src/graph/knowledge_graph.ts @@ -9,7 +9,7 @@ import { TrapiKGNodes, TrapiQualifier, TrapiSource, -} from '../types'; +} from '@biothings-explorer/types'; import KGNode from './kg_node'; import KGEdge from './kg_edge'; import { BTEGraphUpdate } from './graph'; @@ -17,6 +17,8 @@ import { APIDefinition } from '@biothings-explorer/types'; const debug = Debug('bte:biothings-explorer-trapi:KnowledgeGraph'); +const NON_ARRAY_ATTRIBUTES = ['biolink:knowledge_level', 'biolink:agent_type']; + export default class KnowledgeGraph { nodes: { [nodePrimaryID: string]: TrapiKGNode; @@ -114,11 +116,14 @@ export default class KnowledgeGraph { } Object.entries(kgEdge.attributes).forEach(([key, value]) => { - if (key == 'edge-attributes') return; + if (key === 'edge-attributes') return; // if (key == 'edge-attributes') return; attributes.push({ attribute_type_id: key, - value: Array.from(value as Set), + value: // technically works for numbers as well + NON_ARRAY_ATTRIBUTES.includes(key) + ? [...(value as Set)].reduce((acc, val) => acc + val) + : Array.from(value as Set), //value_type_id: 'bts:' + key, }); }); @@ -137,6 +142,7 @@ export default class KnowledgeGraph { const trapiSource: TrapiSource = { ...sourceObj, upstream_resource_ids: sourceObj.upstream_resource_ids ? [...sourceObj.upstream_resource_ids] : undefined, + source_record_urls: sourceObj.source_record_urls ? [...sourceObj.source_record_urls] : undefined, }; sources.push(trapiSource); }); diff --git a/src/index.ts b/src/index.ts index d5f67ccb..22164db9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -25,7 +25,7 @@ import { TrapiQueryGraph, TrapiResponse, TrapiResult, -} from './types'; +} from '@biothings-explorer/types'; import { QueryHandlerOptions } from '@biothings-explorer/types'; import BTEGraph from './graph/graph'; import QEdge from './query_edge'; @@ -174,6 +174,8 @@ export default class TRAPIQueryHandler { const source = Object.entries(ontologyKnowledgeSourceMapping).find(([prefix]) => { return expanded.includes(prefix); })[1]; + subclassEdge.addAdditionalAttributes('biolink:knowledge_level', 'knowledge_assertion') + subclassEdge.addAdditionalAttributes('biolink:agent_type', 'manual_agent') subclassEdge.addSource([ { resource_id: source, resource_role: 'primary_knowledge_source' }, { @@ -210,7 +212,7 @@ export default class TRAPIQueryHandler { suffix += 1; } const supportGraphID = `support${suffix}-${boundEdgeID}`; - auxGraphs[supportGraphID] = { edges: supportGraph }; + auxGraphs[supportGraphID] = { edges: supportGraph, attributes: [] }; if (!edgesIDsByAuxGraphID[supportGraphID]) { edgesIDsByAuxGraphID[supportGraphID] = new Set(); } @@ -222,6 +224,8 @@ export default class TRAPIQueryHandler { object: object, }); boundEdge.addAdditionalAttributes('biolink:support_graphs', [supportGraphID]); + boundEdge.addAdditionalAttributes('biolink:knowledge_level', 'logical_entailment') + boundEdge.addAdditionalAttributes('biolink:agent_type', 'automated_agent') boundEdge.addSource([ { resource_id: this.options.provenanceUsesServiceProvider @@ -251,7 +255,7 @@ export default class TRAPIQueryHandler { boundIDs.add(binding.id); } } else if (!boundIDs.has(nodesToRebind[binding.id].newNode)) { - newBindings.push({ id: nodesToRebind[binding.id].newNode }); + newBindings.push({ id: nodesToRebind[binding.id].newNode, attributes: [] }); boundIDs.add(nodesToRebind[binding.id].newNode); } return { boundIDs, newBindings }; @@ -273,7 +277,7 @@ export default class TRAPIQueryHandler { boundIDs.add(binding.id); } } else if (!boundIDs.has(edgesToRebind[binding.id])) { - newBindings.push({ id: edgesToRebind[binding.id] }); + newBindings.push({ id: edgesToRebind[binding.id], attributes: [] }); boundIDs.add(edgesToRebind[binding.id]); resultBoundEdgesWithAuxGraphs.add(edgesToRebind[binding.id]); } @@ -334,7 +338,7 @@ export default class TRAPIQueryHandler { description: `Query processed successfully, retrieved ${results.length} results.`, schema_version: global.SCHEMA_VERSION, biolink_version: global.BIOLINK_VERSION, - workflow: [{ id: 'lookup' }], + workflow: [{ id: this.options.smartAPIID || this.options.teamName ? 'lookup' : 'lookup_and_score' }], message: { query_graph: this.originalQueryGraph, knowledge_graph: this.knowledgeGraph.kg, diff --git a/src/inferred_mode/inferred_mode.ts b/src/inferred_mode/inferred_mode.ts index dd5178a0..44830c5f 100644 --- a/src/inferred_mode/inferred_mode.ts +++ b/src/inferred_mode/inferred_mode.ts @@ -6,9 +6,8 @@ import biolink from '../biolink'; import { getTemplates, MatchedTemplate, TemplateLookup } from './template_lookup'; import { scaled_sigmoid, inverse_scaled_sigmoid } from '../results_assembly/score'; import TRAPIQueryHandler from '../index'; -import { QueryHandlerOptions } from '@biothings-explorer/types'; import { - CompactQualifiers, + QueryHandlerOptions, TrapiAuxGraphCollection, TrapiEdgeBinding, TrapiKnowledgeGraph, @@ -18,7 +17,8 @@ import { TrapiResponse, TrapiResult, TrapiAnalysis -} from '../types'; +} from '@biothings-explorer/types'; +import { CompactQualifiers } from '../index'; const debug = Debug('bte:biothings-explorer-trapi:inferred-mode'); export interface CombinedResponse { @@ -293,12 +293,13 @@ export default class InferredQueryHandler { // modified count used for pathfinder const pfIntermediateSet = new Set(); + let auxGraphSuffixes: {[inferredEdgeID: string]: number} = {}; // add results newResponse.message.results.forEach((result) => { const translatedResult: TrapiResult = { node_bindings: { - [qEdge.subject]: [{ id: result.node_bindings.creativeQuerySubject[0].id }], - [qEdge.object]: [{ id: result.node_bindings.creativeQueryObject[0].id }], + [qEdge.subject]: [{ id: result.node_bindings.creativeQuerySubject[0].id, attributes: [] }], + [qEdge.object]: [{ id: result.node_bindings.creativeQueryObject[0].id, attributes: [] }], }, pfocr: result.pfocr?.length ? result.pfocr : undefined, analyses: [ @@ -332,14 +333,14 @@ export default class InferredQueryHandler { // Direct edge answers stand on their own, not as an inferred edge. if (Object.keys(result.node_bindings).length == 2) { const boundEdgeID = Object.values(result.analyses[0].edge_bindings)[0][0].id; - translatedResult.analyses[0].edge_bindings = { [qEdgeID]: [{ id: boundEdgeID }] }; + translatedResult.analyses[0].edge_bindings = { [qEdgeID]: [{ id: boundEdgeID, attributes: [] }] }; } else { // Create an aux graph using the result and associate it with an inferred Edge const inferredEdgeID = `inferred-${resultCreativeSubjectID}-${qEdge.predicates[0].replace( 'biolink:', '', )}-${resultCreativeObjectID}`; - translatedResult.analyses[0].edge_bindings = { [qEdgeID]: [{ id: inferredEdgeID }] }; + translatedResult.analyses[0].edge_bindings = { [qEdgeID]: [{ id: inferredEdgeID, attributes: [] }] }; if (!combinedResponse.message.knowledge_graph.edges[inferredEdgeID]) { combinedResponse.message.knowledge_graph.edges[inferredEdgeID] = { subject: resultCreativeSubjectID, @@ -353,16 +354,16 @@ export default class InferredQueryHandler { resource_role: 'primary_knowledge_source', }, ], - attributes: [{ attribute_type_id: 'biolink:support_graphs', value: [] }], + attributes: [ + { attribute_type_id: 'biolink:support_graphs', value: [] }, + { attribute_type_id: 'biolink:knowledge_level', value: "prediction" }, + { attribute_type_id: 'biolink:agent_type', value: "computational_model" }, + ], }; } - let auxGraphSuffix = 0; - while ( - Object.keys(combinedResponse.message.auxiliary_graphs).includes(`${inferredEdgeID}-support${auxGraphSuffix}`) - ) { - auxGraphSuffix += 1; - } - const auxGraphID = `${inferredEdgeID}-support${auxGraphSuffix}`; + if (!auxGraphSuffixes[inferredEdgeID]) auxGraphSuffixes[inferredEdgeID] = 0; + const auxGraphID = `${inferredEdgeID}-support${auxGraphSuffixes[inferredEdgeID]}`; + auxGraphSuffixes[inferredEdgeID]++; (combinedResponse.message.knowledge_graph.edges[inferredEdgeID].attributes[0].value as string[]).push( auxGraphID, ); @@ -374,6 +375,7 @@ export default class InferredQueryHandler { }, [] as string[], ), + attributes: [] }; if (this.pathfinder) { @@ -410,9 +412,9 @@ export default class InferredQueryHandler { if (typeof combinedResponse.message.results[resultID].analyses[0].score !== 'undefined') { combinedResponse.message.results[resultID].analyses[0].score = resScore ? scaled_sigmoid( - inverse_scaled_sigmoid(combinedResponse.message.results[resultID].analyses[0].score) + - inverse_scaled_sigmoid(resScore), - ) + inverse_scaled_sigmoid(combinedResponse.message.results[resultID].analyses[0].score) + + inverse_scaled_sigmoid(resScore), + ) : combinedResponse.message.results[resultID].analyses[0].score; } else { combinedResponse.message.results[resultID].analyses[0].score = resScore; @@ -524,7 +526,7 @@ export default class InferredQueryHandler { description: '', schema_version: global.SCHEMA_VERSION, biolink_version: global.BIOLINK_VERSION, - workflow: [{ id: 'lookup' }], + workflow: [{ id: 'lookup_and_score' }], message: { query_graph: this.queryGraph, knowledge_graph: { @@ -585,7 +587,8 @@ export default class InferredQueryHandler { `creative result maximum of ${this.CREATIVE_LIMIT} (reaching ${ creativeLimitHit } merged). `, - `Response will be truncated to top-scoring ${this.CREATIVE_LIMIT} results. Skipping remaining ${subQueries.length - (i + 1) + `Response will be truncated to top-scoring ${this.CREATIVE_LIMIT} results. Skipping remaining ${ + subQueries.length - (i + 1) } `, subQueries.length - (i + 1) === 1 ? `template.` : `templates.`, ].join(''); @@ -610,8 +613,9 @@ export default class InferredQueryHandler { const total = Object.values(mergedResultsCount).reduce((sum, count) => sum + count, 0) + Object.keys(mergedResultsCount).length; - const message = `Merging Summary: (${total}) inferred-template results were merged into (${Object.keys(mergedResultsCount).length - }) final results, reducing result count by (${total - Object.keys(mergedResultsCount).length})`; + const message = `Merging Summary: (${total}) inferred-template results were merged into (${ + Object.keys(mergedResultsCount).length + }) final results, reducing result count by (${total - Object.keys(mergedResultsCount).length})`; debug(message); combinedResponse.logs.push(new LogEntry('INFO', null, message).getLog()); } diff --git a/src/inferred_mode/pathfinder.ts b/src/inferred_mode/pathfinder.ts index 889f099b..4591bf77 100644 --- a/src/inferred_mode/pathfinder.ts +++ b/src/inferred_mode/pathfinder.ts @@ -1,9 +1,8 @@ import TRAPIQueryHandler from '../index'; -import { TrapiResponse, TrapiQEdge, TrapiResult, TrapiQueryGraph, TrapiQNode, TrapiAnalysis } from '../types'; +import { TrapiResponse, TrapiQEdge, TrapiResult, TrapiQueryGraph, TrapiQNode, TrapiAnalysis, QueryHandlerOptions } from '@biothings-explorer/types'; import InferredQueryHandler from './inferred_mode'; import { scaled_sigmoid, inverse_scaled_sigmoid } from '../results_assembly/score'; import { LogEntry, StampedLog, Telemetry } from '@biothings-explorer/utils'; -import { QueryHandlerOptions } from '@biothings-explorer/types'; import Debug from 'debug'; const debug = Debug('bte:biothings-explorer-trapi:pathfinder'); @@ -313,4 +312,4 @@ export default class PathfinderQueryHandler { return { results: newResultObject, graphs: newAuxGraphs }; } -} \ No newline at end of file +} diff --git a/src/inferred_mode/template_lookup.ts b/src/inferred_mode/template_lookup.ts index 83607a80..d5616723 100644 --- a/src/inferred_mode/template_lookup.ts +++ b/src/inferred_mode/template_lookup.ts @@ -2,7 +2,8 @@ import { promises as fs } from 'fs'; import path from 'path'; import async from 'async'; -import { TrapiQueryGraph, CompactQualifiers } from '../types'; +import { TrapiQueryGraph } from '@biothings-explorer/types'; +import { CompactQualifiers } from '../types'; export interface TemplateLookup { subject: string; diff --git a/src/query_edge.ts b/src/query_edge.ts index e380b51c..a9513741 100644 --- a/src/query_edge.ts +++ b/src/query_edge.ts @@ -6,7 +6,7 @@ import { Record, RecordNode, FrozenRecord } from '@biothings-explorer/api-respon import QNode from './query_node'; import { QNodeInfo } from './query_node'; import { LogEntry, StampedLog } from '@biothings-explorer/utils'; -import { TrapiAttributeConstraint, TrapiQualifierConstraint } from './types'; +import { TrapiAttributeConstraint, TrapiQualifierConstraint } from '@biothings-explorer/types'; const debug = Debug('bte:biothings-explorer-trapi:QEdge'); diff --git a/src/query_graph.ts b/src/query_graph.ts index cb1a0c2b..3412c82b 100644 --- a/src/query_graph.ts +++ b/src/query_graph.ts @@ -7,7 +7,7 @@ import biolink from './biolink'; import { resolveSRI } from 'biomedical_id_resolver'; import _ from 'lodash'; import * as utils from './utils'; -import { TrapiQueryGraph } from './types'; +import { TrapiQueryGraph } from '@biothings-explorer/types'; const debug = Debug('bte:biothings-explorer-trapi:query_graph'); diff --git a/src/results_assembly/pfocr.ts b/src/results_assembly/pfocr.ts index 1afd52b4..7f68528c 100644 --- a/src/results_assembly/pfocr.ts +++ b/src/results_assembly/pfocr.ts @@ -4,7 +4,7 @@ const debug = Debug('bte:biothings-explorer-trapi:pfocr'); import { intersection } from '../utils'; import _ from 'lodash'; import { LogEntry, StampedLog } from '@biothings-explorer/utils'; -import { TrapiResult } from '../types'; +import { TrapiResult } from '@biothings-explorer/types'; // the minimum acceptable intersection size between the CURIEs // in a TRAPI result and in a PFOCR figure. diff --git a/src/results_assembly/query_results.ts b/src/results_assembly/query_results.ts index 026556fc..51dff31c 100644 --- a/src/results_assembly/query_results.ts +++ b/src/results_assembly/query_results.ts @@ -1,5 +1,5 @@ import { LogEntry, StampedLog } from '@biothings-explorer/utils'; -import { TrapiResult } from '../types'; +import { TrapiResult } from '@biothings-explorer/types'; import Debug from 'debug'; import { zip } from 'lodash'; const debug = Debug('bte:biothings-explorer-trapi:QueryResult'); @@ -452,18 +452,21 @@ export default class TrapiResultsAssembler { result.node_bindings[inputQNodeID] = Array.from(inputPrimaryCuries).map((inputPrimaryCurie) => { return { id: inputPrimaryCurie, + attributes: [], }; }); result.node_bindings[outputQNodeID] = Array.from(outputPrimaryCuries).map((outputPrimaryCurie) => { return { id: outputPrimaryCurie, + attributes: [], }; }); result.analyses[0].edge_bindings[qEdgeID] = Array.from(recordHashes).map((recordHash) => { return { id: recordHash, + attributes: [], }; }); }, diff --git a/src/types.ts b/src/types.ts index 77ac472e..21388766 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,153 +1,5 @@ import { TrapiLog } from '@biothings-explorer/utils'; -export interface TrapiQNode { - ids?: string[]; - categories?: string[]; - is_set?: boolean; - constraints?: TrapiAttributeConstraint[]; -} - -export interface TrapiQEdge { - knowledge_type?: string; - predicates?: string[]; - subject: string; - object: string; - attribute_constraints?: TrapiAttributeConstraint[]; - qualifier_constraints?: TrapiQualifierConstraint[]; -} - -export interface TrapiQueryGraph { - nodes: { - [QNodeID: string]: TrapiQNode; - }; - edges: { - [QEdgeID: string]: TrapiQEdge; - }; -} - -export interface TrapiSource { - resource_id: string; - resource_role: string; - upstream_resource_ids?: string[]; -} - -export interface TrapiKGNodes { - [nodeID: string]: TrapiKGNode; -} - -export interface TrapiKGEdges { - [edgeID: string]: TrapiKGEdge; -} - -export interface TrapiKnowledgeGraph { - nodes: TrapiKGNodes; - edges: TrapiKGEdges; -} - -export interface TrapiKGEdge { - predicate: string; - subject: string; - object: string; - attributes?: TrapiAttribute[]; - qualifiers?: TrapiQualifier[]; - sources: TrapiSource[]; -} - -export interface TrapiKGNode { - categories: string[]; - name: string; - attributes?: TrapiAttribute[]; -} - -export interface TrapiAttribute { - attribute_type_id: string; - original_attribute_name?: string; - value: string | string[] | number | number[]; - value_type_id?: string; - attribute_source?: string | null; - value_url?: string | null; - attributes?: TrapiAttribute; - [additionalProperties: string]: string | string[] | null | TrapiAttribute | number | number[]; -} - -export interface TrapiQualifier { - qualifier_type_id: string; - qualifier_value: string | string[]; -} - -export interface TrapiQualifierConstraint { - qualifier_set: TrapiQualifier[]; -} - -export interface TrapiAttributeConstraint { - id: string; - name: string; - not: boolean; - operator: string; - value: string | string[] | number | number[]; -} - -export interface TrapiNodeBinding { - id: string; - query_id?: string; - attributes?: TrapiAttribute[]; -} - -export interface TrapiEdgeBinding { - id: string; - attributes?: TrapiAttribute[]; -} - -export interface TrapiAnalysis { - resource_id?: string; - score?: number; - edge_bindings: { - [qEdgeID: string]: TrapiEdgeBinding[]; - }; - support_graphs?: string[]; - scoring_method?: string; - attributes?: TrapiAttribute[]; -} - -export interface TrapiAuxiliaryGraph { - edges: string[]; - attributes?: TrapiAttribute[]; -} - -export interface TrapiPfocrFigure { - figureUrl: string; - pmc: string; - matchedCuries: string[]; - score: number; -} - -export interface TrapiResult { - node_bindings: { - [qNodeID: string]: TrapiNodeBinding[]; - }; - analyses: TrapiAnalysis[]; - pfocr?: TrapiPfocrFigure[]; -} - -export interface TrapiAuxGraphCollection { - [supportGraphID: string]: TrapiAuxiliaryGraph; -} - -export interface TrapiResponse { - description?: string; - schema_version?: string; - biolink_version?: string; - workflow?: { id: string }[]; - message: { - query_graph: TrapiQueryGraph; - knowledge_graph: TrapiKnowledgeGraph; - auxiliary_graphs?: TrapiAuxGraphCollection; - results: TrapiResult[]; - }; - logs: TrapiLog[]; -} - - export interface UnavailableAPITracker { [server: string]: { skip: boolean; skippedQueries: number }; } diff --git a/src/update_nodes.ts b/src/update_nodes.ts index e6df65a6..c9c30f93 100644 --- a/src/update_nodes.ts +++ b/src/update_nodes.ts @@ -3,7 +3,7 @@ import Debug from 'debug'; import { ResolverInput, SRIResolverOutput } from 'biomedical_id_resolver'; import { Record } from '@biothings-explorer/api-response-transform'; import QEdge from './query_edge'; -import { NodeNormalizerResultObj } from '../../api-response-transform/built'; +import { NodeNormalizerResultObj } from '@biothings-explorer/api-response-transform'; const debug = Debug('bte:biothings-explorer-trapi:nodeUpdateHandler'); export interface CuriesByCategory {