-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathutils.js
190 lines (169 loc) · 6.31 KB
/
utils.js
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
import { Store, Parser as N3Parser, Writer as N3Writer, DataFactory } from "n3"
const { namedNode, literal } = DataFactory
import Validator from "shacl-engine/Validator.js"
import { validations as sparqlValidations } from "shacl-engine/sparql.js"
import rdf from "rdf-ext"
import { QueryEngine } from "@comunica/query-sparql-rdfjs"
export async function rdfStringsToStore(rdfStrings) {
let store = new Store()
for (let str of rdfStrings) {
await addRdfStringToStore(str, store)
}
return store
}
export function rdfStringToStore(rdfStr) {
let store = new Store()
return addRdfStringToStore(rdfStr, store)
}
export function addRdfStringToStore(rdfStr, store) {
return new Promise((resolve, reject) => {
const parser = new N3Parser()
parser.parse(rdfStr, (error, quad, prefixes) => {
if (error) {
console.error(error)
reject(error)
}
if (quad) {
store.add(quad)
} else {
resolve(store)
}
})
})
}
export function printDatasetAsTurtle(dataset) {
const writer = getWriter()
dataset.forEach(quad => writer.addQuad(quad))
writer.end((error, result) => console.log(result))
}
export function printStoreAsTurtle(store) {
const writer = getWriter()
store.getQuads().forEach(quad => writer.addQuad(quad))
writer.end((error, result) => console.log(result))
}
function getWriter() {
return new N3Writer({ prefixes: {
sh: "http://www.w3.org/ns/shacl#",
ff: "https://foerderfunke.org/default#",
foaf: "http://xmlns.com/foaf/0.1/",
temp: "https://foerderfunke.org/temp#"
}})
}
export async function runValidationOnStore(store) {
let dataset = rdf.dataset(store.getQuads())
let validator = new Validator(dataset, { factory: rdf, debug: false, validations: sparqlValidations })
return await validator.validate({ dataset: dataset })
}
export async function runSparqlSelectQueryOnRdfString(query, rdfStr) {
let store = await rdfStringToStore(rdfStr)
return runSparqlSelectQueryOnStore(query, store)
}
export async function runSparqlAskQueryOnStore(query, store) {
const queryEngine = new QueryEngine()
return await queryEngine.queryBoolean(query, { sources: [store] })
}
export async function runSparqlSelectQueryOnStore(query, store) {
const queryEngine = new QueryEngine()
let bindingsStream = await queryEngine.queryBindings(query, { sources: [ store ] })
let bindings = await bindingsStream.toArray()
let results = []
bindings.forEach(binding => {
const variables = Array.from(binding.keys()).map(({ value }) => value)
let row = {}
variables.forEach(variable => {
row[variable] = binding.get(variable).value
})
results.push(row)
})
return results
}
export async function runSparqlConstructQueryOnRdfString(query, rdfStr) {
let store = await rdfStringToStore(rdfStr)
return runSparqlConstructQueryOnStore(query, store)
}
export async function runSparqlConstructQueryOnStore(query, store) {
const queryEngine = new QueryEngine()
let quadsStream = await queryEngine.queryQuads(query, { sources: [ store ] })
return await quadsStream.toArray()
}
export function extractRpUriFromRpString(rpStr) {
const match = rpStr.match(/(.*?)\s+a ff:RequirementProfile/) // make this more robust with whitespaces/trimming TODO
if (match) {
return expandPrefixedStr(match[1].trim())
}
console.error("Could not extract identifier from requirement profile string: " + rpStr)
return "error"
}
export function convertReqProfilesStrArrToMap(reqProfileStrArr) {
let map = {}
for (let rpStr of reqProfileStrArr) {
map[extractRpUriFromRpString(rpStr)] = rpStr
}
return map
}
export function expandPrefixedStr(str) {
if (str.startsWith("ff:")) return "https://foerderfunke.org/default#" + str.slice(3)
return str
}
export function convertObjectStr(objectStr) {
if (typeof objectStr === "boolean") return literal(objectStr)
objectStr = objectStr.toString()
if (objectStr.toLowerCase() === "true") return literal(true)
if (objectStr.toLowerCase() === "false") return literal(false)
if (objectStr.startsWith("http")) return namedNode(objectStr)
if (objectStr.startsWith("ff:")) return namedNode("https://foerderfunke.org/default#" + objectStr.slice(3))
if (/^\d{4}-\d{2}-\d{2}.*$/.test(objectStr)) return literal(objectStr.substring(0, 10), { value: "xsd:date" })
const num = Number(objectStr)
if (!isNaN(num)) return literal(num)
return literal(objectStr)
}
export function quadToSpo(quad) {
return { s: quad.subject.value, p: quad.predicate.value, o: quad.object.value }
}
export function storeContainsTriple(store, triple) {
return store.has(namedNode(triple.s), namedNode(triple.p), convertObjectStr(triple.o))
}
export async function getDeferments(store) {
let defermentRows = await runSparqlSelectQueryOnStore(`
PREFIX ff: <https://foerderfunke.org/default#>
SELECT * WHERE {
?defermentUri a ff:Deferment ;
rdf:subject ?subject ;
rdf:predicate ?predicate .
}`, store)
let deferments = {}
for (let row of defermentRows) {
deferments[row.subject + "_" + row.predicate] = { uri: row.defermentUri }
}
return deferments
}
export async function getModifiableDatafields(store) {
let query = `
PREFIX ff: <https://foerderfunke.org/default#>
SELECT * WHERE {
?df a ff:DataField ;
ff:modifiable true .
}`
let rows = await runSparqlSelectQueryOnStore(query, store)
let dfs = []
for (let row of rows) {
dfs.push(row.df)
}
return dfs
}
/*export async function rdfStringToDataset(rdfStr) {
const store = await rdfStringToStore(rdfStr)
return rdf.dataset(store.getQuads())
}
export function parseSparqlQuery(query) {
// import SparqlParser from "sparqljs"
// import util from "util"
// console.log(util.inspect(queryObj, false, null, true))
const queryParser = new SparqlParser.Parser()
return queryParser.parse(query)
}
export async function runSparqlDeleteQueryOnStore(query, store) {
const queryEngine = new QueryEngine()
return await queryEngine.queryVoid(query, { sources: [ store ] })
}
*/