Mercurial > code > home > repos > streamed-graph
annotate src/layout/rdf_value.ts @ 109:cbcd82d21356
cleanup
author | drewp@bigasterisk.com |
---|---|
date | Fri, 18 Mar 2022 12:00:33 -0700 |
parents | 5e6840229a05 |
children | 4b33a479dc2f |
rev | line source |
---|---|
109 | 1 import { NamedNode, Store, Term } from "n3"; |
95 | 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 } | |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
47 |
109 | 48 export function uniqueSortedTerms<T extends NamedNode | Term>( |
49 terms: Iterable<T> | |
50 ): T[] { | |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
51 const uniques: T[] = []; |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
52 const seen = new Set(); |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
53 for (let o of terms) { |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
54 if (!seen.has(o.id)) { |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
55 seen.add(o.id); |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
56 uniques.push(o); |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
57 } |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
58 } |
109 | 59 uniques.sort((a, b) => { |
60 return a.id.localeCompare(b.id); | |
61 }); | |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
62 return uniques; |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
63 } |