Mercurial > code > home > repos > homeauto
changeset 1586:b459b5c3c33a
some rdf code. maybe copied from light9?
author | drewp@bigasterisk.com |
---|---|
date | Sun, 29 Aug 2021 13:45:31 -0700 |
parents | c8092f6d70c0 |
children | 9a3a18c494f9 |
files | service/mqtt_to_rdf/src/graph_access.ts |
diffstat | 1 files changed, 83 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/service/mqtt_to_rdf/src/graph_access.ts Sun Aug 29 13:45:31 2021 -0700 @@ -0,0 +1,83 @@ +import { Literal, N3Store, Util, NamedNode, DataFactory } from "n3"; +const { literal, namedNode } = DataFactory; + +// workaround for uris that don't have good labels in the graph +export function labelFromUri( + uri: NamedNode, + prefix: string, + tailsToLabels: { [key: string]: string }, + defaultLabel: string +) { + let label = defaultLabel === undefined ? uri.value : defaultLabel; + Object.entries(tailsToLabels).forEach(([tail, useLabel]) => { + if (uri.equals(namedNode(prefix + tail))) { + label = useLabel as string; + } + }); + return label; +} + +export function graphLiteral( + store: N3Store, + subj: NamedNode, + pred: string, + notFoundResult?: string +): Literal { + const keep: Array<Literal> = []; + store.forEach( + q => { + if (!Util.isLiteral(q.object)) { + throw new Error("non literal found"); + } + let seen = false; + for (let other of keep) { + // why are we getting multiple matches for the same literal? seems like a bug + if (other.equals(q.object)) { + seen = true; + } + } + if (!seen) { + keep.push(q.object as Literal); + } + }, + subj, + namedNode(pred), + null, + null + ); + if (keep.length == 0) { + return literal(notFoundResult || "(missing)"); + } + if (keep.length == 1) { + return keep[0]; + } + console.log(`${subj.value} ${pred} had ${keep.length} objects:`, keep); + return keep[0]; +} + +export function graphUriValue( + store: N3Store, + subj: NamedNode, + pred: string +): NamedNode | undefined { + const keep: Array<NamedNode> = []; + store.forEach( + q => { + if (!Util.isNamedNode(q.object)) { + throw new Error("non uri found"); + } + keep.push(q.object as NamedNode); + }, + subj, + namedNode(pred), + null, + null + ); + if (keep.length == 0) { + return undefined; + } + if (keep.length == 1) { + return keep[0]; + } + throw new Error("found multiple matches for pred"); +}