Mercurial > code > home > repos > streamed-graph
diff src/layout/json_ld_quads.ts @ 106:2468f2227d22
make src/layout/ and src/render/ separation
author | drewp@bigasterisk.com |
---|---|
date | Sun, 13 Mar 2022 22:00:30 -0700 |
parents | src/json_ld_quads.ts@77aa2e9234ed |
children | 5a1a79f54779 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/layout/json_ld_quads.ts Sun Mar 13 22:00:30 2022 -0700 @@ -0,0 +1,67 @@ +import * as jsonld from "jsonld"; +import { JsonLd, JsonLdArray } from "jsonld/jsonld-spec"; +import { Quad, NamedNode, DataFactory } from "n3"; +const { literal, quad, namedNode } = DataFactory; + +// const { rdf } = ns; +const rdf = { type: "http://www.w3.org/1999/02/22-rdf-syntax-ns#type" }; + +function parseObjNode(obj: any) { + if (obj["@id"]) { + return namedNode(obj["@id"]); + } else { + if (obj["@value"] === undefined) { + throw new Error("no @id or @value"); + } + return literal(obj["@value"], obj["@language"] || obj["@type"]); + } +} + +function parsePred( + onQuad: (q: Quad) => void, + graphNode: NamedNode, + subjNode: NamedNode, + predKey: string, + subjGroup: any +) { + let predNode: NamedNode; + if (predKey === "@type") { + subjGroup["@type"].forEach((aType: string) => { + onQuad(quad(subjNode, namedNode(rdf.type), namedNode(aType), graphNode)); + }); + return; + } + predNode = namedNode(predKey); + subjGroup[predKey].forEach(function(obj: any) { + const objNode = parseObjNode(obj); + onQuad(quad(subjNode, predNode, objNode, graphNode)); + }); +} +function parseSubj( + onQuad: (q: Quad) => void, + graphNode: NamedNode, + subjGroup: { [predOrId: string]: any } +) { + const subjNode = namedNode(subjGroup["@id"]); + for (let predKey in subjGroup) { + if (predKey === "@id") { + continue; + } + parsePred(onQuad, graphNode, subjNode, predKey, subjGroup); + } +} +function parseGraph(onQuad: (q: Quad) => void, g: JsonLd) { + var graph = (g as { "@id": string })["@id"]; + var graphNode = namedNode(graph); + (g as { "@graph": JsonLdArray })["@graph"].forEach(subj => { + parseSubj(onQuad, graphNode, subj); + }); +} + +export async function eachJsonLdQuad( + jsonLdObj: object, + onQuad: (q: Quad) => void +) { + const expanded = await jsonld.expand(jsonLdObj); + (expanded as JsonLdArray).forEach((g: JsonLd) => parseGraph(onQuad, g)); +}