/
rdf.ts
155 lines (132 loc) · 4.17 KB
/
rdf.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
import type {
Bindings,
BlankNode,
Literal,
NamedNode,
Quad,
Term,
Variable,
} from "https://esm.sh/rdf-js@4.0.2";
export type { Bindings, BlankNode, Literal, NamedNode, Quad, Term, Variable };
import type * as RDF from "https://esm.sh/rdf-js@4.0.2";
export type { RDF };
export { fromRdf, toRdf } from "https://esm.sh/rdf-literal@1.3.0";
import { DataFactory } from "https://esm.sh/rdf-data-factory@1.1.1";
export { DataFactory } from "https://esm.sh/rdf-data-factory@1.1.1";
import { BindingsFactory as ComunicaBindingsFactory } from "https://esm.sh/@comunica/bindings-factory@2.2.0";
import type {
IDataSource,
IQueryContextCommon,
} from "https://esm.sh/@comunica/types@2.4.0";
export type LDkitContext = {
graph?: string;
language?: string;
};
export type Context =
& LDkitContext
& RDF.QueryStringContext
& RDF.QuerySourceContext<IDataSource>
& IQueryContextCommon;
export type IQueryEngine = RDF.StringSparqlQueryable<
RDF.SparqlResultSupport,
Context
>;
export type Iri = string;
export type Node = Map<Iri, Term[]>;
export type Graph = Map<Iri, Node>;
export const quadsToGraph = (quads: Quad[]) => {
const graph: Graph = new Map();
for (const quad of quads) {
const s = quad.subject.value;
const p = quad.predicate.value;
const predicateMap = graph.get(s) || graph.set(s, new Map()).get(s)!;
const termArray = predicateMap.get(p) || predicateMap.set(p, []).get(p)!;
termArray.push(quad.object);
}
return graph;
};
export declare namespace RDFJSON {
type Term = {
type: "uri" | "literal" | "bnode";
value: string;
"xml:lang"?: string;
datatype?: string;
};
type Bindings = Record<string, Term>;
interface TermFactory {
fromJson(jsonTerm: Term): RDF.Term;
}
interface BindingsFactory {
fromJson(jsonBindings: Bindings): RDF.Bindings;
}
interface QuadFactory {
fromJson(jsonBindings: Bindings): RDF.Quad;
}
}
export class TermFactory implements RDFJSON.TermFactory {
protected readonly dataFactory: RDF.DataFactory;
constructor(dataFactory: RDF.DataFactory = new DataFactory()) {
this.dataFactory = dataFactory;
}
fromJson(jsonTerm: RDFJSON.Term) {
if (jsonTerm.type === "uri") {
return this.dataFactory.namedNode(jsonTerm.value);
}
if (jsonTerm.type === "bnode") {
return this.dataFactory.blankNode(jsonTerm.value);
}
if ("xml:lang" in jsonTerm) {
return this.dataFactory.literal(jsonTerm.value, jsonTerm["xml:lang"]);
}
if ("datatype" in jsonTerm) {
return this.dataFactory.literal(
jsonTerm.value,
this.dataFactory.namedNode(jsonTerm.datatype!),
);
}
return this.dataFactory.literal(jsonTerm.value);
}
}
export class BindingsFactory extends ComunicaBindingsFactory
implements RDFJSON.BindingsFactory {
protected readonly localDataFactory: RDF.DataFactory;
protected readonly termFactory: RDFJSON.TermFactory;
constructor(
dataFactory: RDF.DataFactory = new DataFactory(),
termFactory: RDFJSON.TermFactory = new TermFactory(),
) {
super(dataFactory);
this.localDataFactory = dataFactory;
this.termFactory = termFactory;
}
fromJson(jsonBindings: RDFJSON.Bindings) {
const bindingsEntries = Object.entries(jsonBindings).map((
[varName, jsonTerm],
) => {
return [
this.localDataFactory.variable!(varName),
this.termFactory.fromJson(jsonTerm),
] as [RDF.Variable, RDF.Term];
});
return this.bindings(bindingsEntries) as unknown as RDF.Bindings;
}
}
export class QuadFactory implements RDFJSON.QuadFactory {
protected readonly dataFactory: RDF.DataFactory;
protected readonly bindingsFactory: RDFJSON.BindingsFactory;
constructor(
dataFactory: RDF.DataFactory = new DataFactory(),
bindingsFactory: RDFJSON.BindingsFactory = new BindingsFactory(dataFactory),
) {
this.dataFactory = dataFactory;
this.bindingsFactory = bindingsFactory;
}
fromJson(jsonBindings: RDFJSON.Bindings) {
const bindings = this.bindingsFactory.fromJson(jsonBindings);
return this.dataFactory.quad(
bindings.get("s") as RDF.Quad_Subject,
bindings.get("p") as RDF.Quad_Predicate,
bindings.get("o") as RDF.Quad_Object,
);
}
}