From 731ef8432f1d358eb7e303bbd7ca22261cba9f4f Mon Sep 17 00:00:00 2001 From: Rohan Juneja Date: Tue, 4 Apr 2023 18:48:42 -0700 Subject: [PATCH 1/7] association/qualifiers in meta knowledge graph --- .../async_operations_builder_with_reasoner.ts | 4 +++- .../sync_operations_builder_with_reasoner.ts | 4 +++- src/parser/endpoint.ts | 1 + src/parser/types.ts | 2 ++ src/types.ts | 3 ++- 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/operations_builder/async_operations_builder_with_reasoner.ts b/src/operations_builder/async_operations_builder_with_reasoner.ts index fb6d5e9..165f7c0 100644 --- a/src/operations_builder/async_operations_builder_with_reasoner.ts +++ b/src/operations_builder/async_operations_builder_with_reasoner.ts @@ -67,9 +67,11 @@ export default class AsyncOperationsBuilderWithReasoner extends AsyncOperationsB association: { input_type: this.removeBioLinkPrefix(sbj), output_type: this.removeBioLinkPrefix(obj), - predicate: this.removeBioLinkPrefix(pred), + predicate: this.removeBioLinkPrefix(typeof(pred) === "string" ? pred : pred.predicate), api_name: metadata.title, smartapi: metadata.smartapi, + association_id: typeof(pred) === "string" ? undefined : pred.association_id, + qualifiers: typeof(pred) === "string" ? undefined : pred.qualifiers, "x-translator": metadata["x-translator"], }, tags: [...metadata.tags, ...["bte-trapi"]], diff --git a/src/operations_builder/sync_operations_builder_with_reasoner.ts b/src/operations_builder/sync_operations_builder_with_reasoner.ts index 8fed28c..c723e86 100644 --- a/src/operations_builder/sync_operations_builder_with_reasoner.ts +++ b/src/operations_builder/sync_operations_builder_with_reasoner.ts @@ -48,9 +48,11 @@ export default class SyncOperationsBuilderWithReasoner extends BaseOperationsBui input_id: metadata?.nodes?.[sbj]?.id_prefixes, output_type: this.removeBioLinkPrefix(obj), output_id: metadata?.nodes?.[obj]?.id_prefixes, - predicate: this.removeBioLinkPrefix(pred), + predicate: this.removeBioLinkPrefix(typeof(pred) === "string" ? pred : pred.predicate), api_name: metadata.association.api_name, smartapi: metadata.association.smartapi, + association_id: typeof(pred) === "string" ? undefined : pred.association_id, + qualifiers: typeof(pred) === "string" ? undefined : pred.qualifiers, "x-translator": metadata.association["x-translator"], "x-trapi": metadata.association["x-trapi"], }, diff --git a/src/parser/endpoint.ts b/src/parser/endpoint.ts index b92a082..82d0a52 100644 --- a/src/parser/endpoint.ts +++ b/src/parser/endpoint.ts @@ -84,6 +84,7 @@ export default class Endpoint { output_id: this.removeBioLinkPrefix(output.id), output_type: this.removeBioLinkPrefix(output.semantic), predicate: this.removeBioLinkPrefix(op.predicate), + association_id: this.removeBioLinkPrefix(op.association_id), qualifiers: op.qualifiers ? Object.fromEntries( Object.entries(op.qualifiers).map(([qualifierType, qualifier]) => [ diff --git a/src/parser/types.ts b/src/parser/types.ts index 15cc99b..346eb89 100644 --- a/src/parser/types.ts +++ b/src/parser/types.ts @@ -111,6 +111,7 @@ export interface XBTEKGSOperationObject { inputs: XBTEKGSOperationBioEntityObject[]; outputs: XBTEKGSOperationBioEntityObject[]; predicate: string; + association_id: string; qualifiers?: { [qualifierType: string]: string; }; source?: string; parameters?: XBTEParametersObject; @@ -158,6 +159,7 @@ interface KGAssociationObject { api_name?: string; component?: string; smartapi?: SmartAPIRegistryRecordObject; + association_id: string; "x-translator"?: any; "x-trapi"?: XTRAPIObject; qualifiers?: { diff --git a/src/types.ts b/src/types.ts index 839c17f..aff85f9 100644 --- a/src/types.ts +++ b/src/types.ts @@ -37,6 +37,7 @@ interface PredicatesQueryOperationInterface { interface PredicatesAssociationInterface { api_name: string; smartapi: SmartAPIRegistryRecordObject; + association_id: string; "x-translator": any; "x-trapi"?: XTRAPIObject; } @@ -58,7 +59,7 @@ interface PredicatesNode { } interface ReasonerSubjectAndPredicate { - [propName: string]: string[]; + [propName: string]: any[]; } export interface ReasonerPredicatesResponse { From 0726f1c5cfa7755af82b03fbd22dad6ac7345223 Mon Sep 17 00:00:00 2001 From: Rohan Juneja Date: Tue, 4 Apr 2023 18:58:34 -0700 Subject: [PATCH 2/7] association id optional --- src/parser/types.ts | 4 ++-- src/types.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/parser/types.ts b/src/parser/types.ts index 346eb89..7816640 100644 --- a/src/parser/types.ts +++ b/src/parser/types.ts @@ -111,7 +111,7 @@ export interface XBTEKGSOperationObject { inputs: XBTEKGSOperationBioEntityObject[]; outputs: XBTEKGSOperationBioEntityObject[]; predicate: string; - association_id: string; + association_id?: string; qualifiers?: { [qualifierType: string]: string; }; source?: string; parameters?: XBTEParametersObject; @@ -159,7 +159,7 @@ interface KGAssociationObject { api_name?: string; component?: string; smartapi?: SmartAPIRegistryRecordObject; - association_id: string; + association_id?: string; "x-translator"?: any; "x-trapi"?: XTRAPIObject; qualifiers?: { diff --git a/src/types.ts b/src/types.ts index aff85f9..6150c68 100644 --- a/src/types.ts +++ b/src/types.ts @@ -37,7 +37,7 @@ interface PredicatesQueryOperationInterface { interface PredicatesAssociationInterface { api_name: string; smartapi: SmartAPIRegistryRecordObject; - association_id: string; + association_id?: string; "x-translator": any; "x-trapi"?: XTRAPIObject; } From f95b5ad70d701625ee8376d7c79b53bd5352799e Mon Sep 17 00:00:00 2001 From: Rohan Juneja Date: Wed, 12 Apr 2023 13:45:04 -0700 Subject: [PATCH 3/7] move association to its own branch --- .../async_operations_builder_with_reasoner.ts | 1 - src/operations_builder/sync_operations_builder_with_reasoner.ts | 1 - src/parser/endpoint.ts | 1 - src/parser/types.ts | 2 -- src/types.ts | 1 - 5 files changed, 6 deletions(-) diff --git a/src/operations_builder/async_operations_builder_with_reasoner.ts b/src/operations_builder/async_operations_builder_with_reasoner.ts index 165f7c0..b1c2ec7 100644 --- a/src/operations_builder/async_operations_builder_with_reasoner.ts +++ b/src/operations_builder/async_operations_builder_with_reasoner.ts @@ -70,7 +70,6 @@ export default class AsyncOperationsBuilderWithReasoner extends AsyncOperationsB predicate: this.removeBioLinkPrefix(typeof(pred) === "string" ? pred : pred.predicate), api_name: metadata.title, smartapi: metadata.smartapi, - association_id: typeof(pred) === "string" ? undefined : pred.association_id, qualifiers: typeof(pred) === "string" ? undefined : pred.qualifiers, "x-translator": metadata["x-translator"], }, diff --git a/src/operations_builder/sync_operations_builder_with_reasoner.ts b/src/operations_builder/sync_operations_builder_with_reasoner.ts index c723e86..63c4ce6 100644 --- a/src/operations_builder/sync_operations_builder_with_reasoner.ts +++ b/src/operations_builder/sync_operations_builder_with_reasoner.ts @@ -51,7 +51,6 @@ export default class SyncOperationsBuilderWithReasoner extends BaseOperationsBui predicate: this.removeBioLinkPrefix(typeof(pred) === "string" ? pred : pred.predicate), api_name: metadata.association.api_name, smartapi: metadata.association.smartapi, - association_id: typeof(pred) === "string" ? undefined : pred.association_id, qualifiers: typeof(pred) === "string" ? undefined : pred.qualifiers, "x-translator": metadata.association["x-translator"], "x-trapi": metadata.association["x-trapi"], diff --git a/src/parser/endpoint.ts b/src/parser/endpoint.ts index 82d0a52..b92a082 100644 --- a/src/parser/endpoint.ts +++ b/src/parser/endpoint.ts @@ -84,7 +84,6 @@ export default class Endpoint { output_id: this.removeBioLinkPrefix(output.id), output_type: this.removeBioLinkPrefix(output.semantic), predicate: this.removeBioLinkPrefix(op.predicate), - association_id: this.removeBioLinkPrefix(op.association_id), qualifiers: op.qualifiers ? Object.fromEntries( Object.entries(op.qualifiers).map(([qualifierType, qualifier]) => [ diff --git a/src/parser/types.ts b/src/parser/types.ts index 7816640..15cc99b 100644 --- a/src/parser/types.ts +++ b/src/parser/types.ts @@ -111,7 +111,6 @@ export interface XBTEKGSOperationObject { inputs: XBTEKGSOperationBioEntityObject[]; outputs: XBTEKGSOperationBioEntityObject[]; predicate: string; - association_id?: string; qualifiers?: { [qualifierType: string]: string; }; source?: string; parameters?: XBTEParametersObject; @@ -159,7 +158,6 @@ interface KGAssociationObject { api_name?: string; component?: string; smartapi?: SmartAPIRegistryRecordObject; - association_id?: string; "x-translator"?: any; "x-trapi"?: XTRAPIObject; qualifiers?: { diff --git a/src/types.ts b/src/types.ts index 6150c68..809185f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -37,7 +37,6 @@ interface PredicatesQueryOperationInterface { interface PredicatesAssociationInterface { api_name: string; smartapi: SmartAPIRegistryRecordObject; - association_id?: string; "x-translator": any; "x-trapi"?: XTRAPIObject; } From 37d79d12ef7b3bd4c8cbcc44d43e99e86d03df1e Mon Sep 17 00:00:00 2001 From: Rohan Juneja Date: Thu, 13 Apr 2023 15:02:48 -0700 Subject: [PATCH 4/7] handle array qualifiers in filter --- src/filter.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/filter.ts b/src/filter.ts index dfa6bbe..44df46d 100644 --- a/src/filter.ts +++ b/src/filter.ts @@ -62,6 +62,9 @@ export const ft = (ops: SmartAPIKGOperationObject[], criteria: FilterCriteria) = } return [...filters[field]].some(qualifierConstraintSet => { return Object.entries(qualifierConstraintSet).every(([qualifierType, qualifierValue]) => { + if (Array.isArray(qualifierValue)) { + return rec.association[field] && qualifierValue.includes(rec.association[field][qualifierType]); + } return rec.association[field] && rec.association[field][qualifierType] === qualifierValue; }); }); From 6ed023cd0ddc8a7e234b5a5212c945a64120967e Mon Sep 17 00:00:00 2001 From: Rohan Juneja Date: Wed, 19 Apr 2023 17:50:04 -0700 Subject: [PATCH 5/7] Filter based on qualifiers for trapi apis --- src/filter.ts | 4 ++-- .../async_operations_builder_with_reasoner.ts | 3 ++- .../sync_operations_builder_with_reasoner.ts | 3 ++- src/parser/types.ts | 2 +- src/types.ts | 2 +- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/filter.ts b/src/filter.ts index dfa6bbe..80d7008 100644 --- a/src/filter.ts +++ b/src/filter.ts @@ -57,12 +57,12 @@ export const ft = (ops: SmartAPIKGOperationObject[], criteria: FilterCriteria) = return filters[field].has(rec.association["x-translator"][field]) ? true : false; } else if (field === "qualifiers") { // return true; - if (rec.tags?.includes?.("bte-trapi") || criteria[field] === undefined || criteria[field].length < 1) { + if (criteria[field] === undefined || criteria[field].length < 1) { return true; } return [...filters[field]].some(qualifierConstraintSet => { return Object.entries(qualifierConstraintSet).every(([qualifierType, qualifierValue]) => { - return rec.association[field] && rec.association[field][qualifierType] === qualifierValue; + return rec.association[field] && (Array.isArray(rec.association[field][qualifierType]) ? rec.association[field][qualifierType].includes(qualifierValue as string) : rec.association[field][qualifierType] === qualifierValue); }); }); } else { diff --git a/src/operations_builder/async_operations_builder_with_reasoner.ts b/src/operations_builder/async_operations_builder_with_reasoner.ts index fb6d5e9..b09fe42 100644 --- a/src/operations_builder/async_operations_builder_with_reasoner.ts +++ b/src/operations_builder/async_operations_builder_with_reasoner.ts @@ -67,9 +67,10 @@ export default class AsyncOperationsBuilderWithReasoner extends AsyncOperationsB association: { input_type: this.removeBioLinkPrefix(sbj), output_type: this.removeBioLinkPrefix(obj), - predicate: this.removeBioLinkPrefix(pred), + predicate: this.removeBioLinkPrefix(typeof(pred) === "string" ? pred : pred.predicate), api_name: metadata.title, smartapi: metadata.smartapi, + qualifiers: (typeof(pred) === "string" || !pred.qualifiers) ? undefined : Object.fromEntries(pred.qualifiers.map((q: any) => [this.removeBioLinkPrefix(q.qualifier_type_id), q.applicable_values.map(this.removeBioLinkPrefix)])), "x-translator": metadata["x-translator"], }, tags: [...metadata.tags, ...["bte-trapi"]], diff --git a/src/operations_builder/sync_operations_builder_with_reasoner.ts b/src/operations_builder/sync_operations_builder_with_reasoner.ts index 8fed28c..8fdda71 100644 --- a/src/operations_builder/sync_operations_builder_with_reasoner.ts +++ b/src/operations_builder/sync_operations_builder_with_reasoner.ts @@ -48,9 +48,10 @@ export default class SyncOperationsBuilderWithReasoner extends BaseOperationsBui input_id: metadata?.nodes?.[sbj]?.id_prefixes, output_type: this.removeBioLinkPrefix(obj), output_id: metadata?.nodes?.[obj]?.id_prefixes, - predicate: this.removeBioLinkPrefix(pred), + predicate: this.removeBioLinkPrefix(typeof(pred) === "string" ? pred : pred.predicate), api_name: metadata.association.api_name, smartapi: metadata.association.smartapi, + qualifiers: (typeof(pred) === "string" || !pred.qualifiers) ? undefined : Object.fromEntries(pred.qualifiers.map((q: any) => [this.removeBioLinkPrefix(q.qualifier_type_id), q.applicable_values.map(this.removeBioLinkPrefix)])), "x-translator": metadata.association["x-translator"], "x-trapi": metadata.association["x-trapi"], }, diff --git a/src/parser/types.ts b/src/parser/types.ts index 15cc99b..d091a99 100644 --- a/src/parser/types.ts +++ b/src/parser/types.ts @@ -161,7 +161,7 @@ interface KGAssociationObject { "x-translator"?: any; "x-trapi"?: XTRAPIObject; qualifiers?: { - [qualifierType: string]: string; + [qualifierType: string]: string | string[]; } } diff --git a/src/types.ts b/src/types.ts index 839c17f..822526d 100644 --- a/src/types.ts +++ b/src/types.ts @@ -58,7 +58,7 @@ interface PredicatesNode { } interface ReasonerSubjectAndPredicate { - [propName: string]: string[]; + [propName: string]: (string | any)[]; } export interface ReasonerPredicatesResponse { From 2198ece740a42a8edd8a7037ad19e93eb96427dc Mon Sep 17 00:00:00 2001 From: tokebe <43009413+tokebe@users.noreply.github.com> Date: Thu, 27 Apr 2023 12:18:08 -0700 Subject: [PATCH 6/7] feat: support pprovenance refactor (trapi 1.4) --- .../sync_builder_factory.ts | 28 +++++++++++++++---- src/parser/types.ts | 7 +++-- src/types.ts | 1 + 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/operations_builder/sync_builder_factory.ts b/src/operations_builder/sync_builder_factory.ts index fd6f44f..b342ad3 100644 --- a/src/operations_builder/sync_builder_factory.ts +++ b/src/operations_builder/sync_builder_factory.ts @@ -7,18 +7,34 @@ export const syncBuilderFactory = ( options: BuilderOptions, includeReasoner: boolean, smartapi_path: string, - predicates_path: string + predicates_path: string, ): SmartAPIKGOperationObject[] => { let builder; if (includeReasoner === true) { - builder = new SyncOperationsBuilderWithReasoner( - options, - smartapi_path, - predicates_path - ); + builder = new SyncOperationsBuilderWithReasoner(options, smartapi_path, predicates_path); } else { builder = new SyncOperationsBuilder(options, smartapi_path); } const ops = builder.build(); + + const primaryKnowledgeAPIs = new Set(); + options.apiList?.include.forEach(api => { + if (api.primarySource) { + if (api.id) primaryKnowledgeAPIs.add(api.id); + if (api.infores) primaryKnowledgeAPIs.add(api.infores); + } + }); + options.apiList?.exclude.forEach(api => { + if (api.primarySource) { + if (api.id) primaryKnowledgeAPIs.add(api.id); + if (api.infores) primaryKnowledgeAPIs.add(api.infores); + } + }); + ops.map(op => { + const apiIsPrimaryKnowledgeSource = + primaryKnowledgeAPIs.has(op.association.smartapi.id) || + primaryKnowledgeAPIs.has(op.association["x-translator"].infores); + op.association.apiIsPrimaryKnowledgeSource = apiIsPrimaryKnowledgeSource ? true : false; + }); return ops; }; diff --git a/src/parser/types.ts b/src/parser/types.ts index 15cc99b..8c51e09 100644 --- a/src/parser/types.ts +++ b/src/parser/types.ts @@ -1,7 +1,7 @@ export interface XTranslatorObject { component: string; team: string[]; - "infores"?: string; + infores?: string; } interface SmartAIPInfoObject { @@ -111,7 +111,7 @@ export interface XBTEKGSOperationObject { inputs: XBTEKGSOperationBioEntityObject[]; outputs: XBTEKGSOperationBioEntityObject[]; predicate: string; - qualifiers?: { [qualifierType: string]: string; }; + qualifiers?: { [qualifierType: string]: string }; source?: string; parameters?: XBTEParametersObject; requestBody?: any; @@ -157,12 +157,13 @@ interface KGAssociationObject { source?: string; api_name?: string; component?: string; + apiIsPrimaryKnowledgeSource?: boolean; smartapi?: SmartAPIRegistryRecordObject; "x-translator"?: any; "x-trapi"?: XTRAPIObject; qualifiers?: { [qualifierType: string]: string; - } + }; } export interface QueryOperationInterface { diff --git a/src/types.ts b/src/types.ts index 839c17f..0fc2e07 100644 --- a/src/types.ts +++ b/src/types.ts @@ -5,6 +5,7 @@ export interface SmartAPIQueryResult { } export interface apiListItem { + primarySource?: boolean; id?: string; infores?: string; name: string; From cf1f960f31c70095c11f50aa8e98bf536621826c Mon Sep 17 00:00:00 2001 From: tokebe <43009413+tokebe@users.noreply.github.com> Date: Mon, 22 May 2023 12:28:53 -0400 Subject: [PATCH 7/7] fix: merge optional-array behaviors --- src/filter.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/filter.ts b/src/filter.ts index 69dc06c..8b925f9 100644 --- a/src/filter.ts +++ b/src/filter.ts @@ -62,10 +62,15 @@ export const ft = (ops: SmartAPIKGOperationObject[], criteria: FilterCriteria) = } return [...filters[field]].some(qualifierConstraintSet => { return Object.entries(qualifierConstraintSet).every(([qualifierType, qualifierValue]) => { - if (Array.isArray(qualifierValue)) { - return rec.association[field] && qualifierValue.includes(rec.association[field][qualifierType]); - } - return rec.association[field] && (Array.isArray(rec.association[field][qualifierType]) ? rec.association[field][qualifierType].includes(qualifierValue as string) : rec.association[field][qualifierType] === qualifierValue); + if (!rec.association[field]) return false; + const qualifierValueArray = Array.isArray(qualifierValue) ? qualifierValue : [qualifierValue]; + const associationValueArray = Array.isArray(rec.association[field][qualifierType]) + ? rec.association[field][qualifierType] + : [rec.association[field][qualifierType]]; + + return qualifierValueArray.some(value => { + return associationValueArray.includes(value); + }); }); }); } else {