95
|
1 import { Store, Term, NamedNode } from "n3";
|
|
2 import { RDFS } from "./namespaces";
|
|
3
|
|
4 function _singleValue(g: Store, s: Term, p: Term): Term {
|
|
5 const quads = g.getQuads(s, p, null, null);
|
|
6 const objs = new Set(quads.map((q) => q.object));
|
|
7 if (objs.size == 0) {
|
|
8 throw new Error("no value for " + s.value + " " + p.value);
|
|
9 } else if (objs.size == 1) {
|
|
10 const obj = objs.values().next().value;
|
|
11 return obj as Term;
|
|
12 } else {
|
|
13 throw new Error("too many different values: " + JSON.stringify(quads));
|
|
14 }
|
|
15 }
|
|
16
|
|
17 export function stringValue(g: Store, s: Term, p: Term): string {
|
|
18 const ret = _singleValue(g, s, p);
|
|
19 if (ret.termType != "Literal") {
|
|
20 throw new Error(`ret=${ret}`);
|
|
21 }
|
|
22 return ret.value as string;
|
|
23 }
|
|
24
|
|
25 export function uriValue(g: Store, s: Term, p: Term): NamedNode {
|
|
26 const ret = _singleValue(g, s, p);
|
|
27 if (ret.termType != "NamedNode") {
|
|
28 throw new Error(`ret=${ret}`);
|
|
29 }
|
|
30
|
|
31 return ret;
|
|
32 }
|
|
33
|
|
34 export function labelOrTail(g: Store, uri: NamedNode): string {
|
|
35 let ret: string;
|
|
36 try {
|
|
37 ret = stringValue(g, uri, RDFS("label"));
|
|
38 } catch (e) {
|
|
39 const words = uri.value.split("/");
|
|
40 ret = words[words.length - 1];
|
|
41 }
|
|
42 if (!ret) {
|
|
43 ret = uri.value;
|
|
44 }
|
|
45 return ret;
|
|
46 }
|