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");
+}