contacts-pane 3.0.2 → 3.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +53 -1
- package/dist/contactsPane.js +6487 -763
- package/dist/contactsPane.js.map +1 -1
- package/dist/contactsPane.min.js +2 -0
- package/dist/contactsPane.min.js.map +1 -0
- package/dist/styles/contactsPane.css +602 -0
- package/dist/styles/contactsRDFFormsEnforced.css +513 -0
- package/dist/styles/groupMembership.css +115 -0
- package/dist/styles/individual.css +12 -0
- package/dist/styles/localUtils.css +49 -0
- package/dist/styles/mugshotGallery.css +17 -0
- package/dist/styles/toolsPane.css +43 -0
- package/dist/styles/utilities.css +69 -0
- package/dist/styles/webidControl.css +90 -0
- package/package.json +23 -17
- package/dist/autocompleteBar.d.ts +0 -3
- package/dist/autocompleteBar.d.ts.map +0 -1
- package/dist/autocompleteBar.js +0 -90
- package/dist/autocompleteBar.js.map +0 -1
- package/dist/autocompleteField.d.ts +0 -20
- package/dist/autocompleteField.d.ts.map +0 -1
- package/dist/autocompleteField.js +0 -165
- package/dist/autocompleteField.js.map +0 -1
- package/dist/autocompletePicker.d.ts +0 -15
- package/dist/autocompletePicker.d.ts.map +0 -1
- package/dist/autocompletePicker.js +0 -253
- package/dist/autocompletePicker.js.map +0 -1
- package/dist/contactLogic.js +0 -223
- package/dist/contactLogic.js.map +0 -1
- package/dist/groupMembershipControl.js +0 -107
- package/dist/groupMembershipControl.js.map +0 -1
- package/dist/individual.js +0 -115
- package/dist/individual.js.map +0 -1
- package/dist/mintNewAddressBook.js +0 -145
- package/dist/mintNewAddressBook.js.map +0 -1
- package/dist/mugshotGallery.js +0 -264
- package/dist/mugshotGallery.js.map +0 -1
- package/dist/publicData.d.ts +0 -82
- package/dist/publicData.d.ts.map +0 -1
- package/dist/publicData.js +0 -421
- package/dist/publicData.js.map +0 -1
- package/dist/toolsPane.js +0 -671
- package/dist/toolsPane.js.map +0 -1
- package/dist/webidControl.js +0 -320
- package/dist/webidControl.js.map +0 -1
package/dist/publicData.js
DELETED
|
@@ -1,421 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.escoParameters = exports.dbpediaParameters = exports.AUTOCOMPLETE_LIMIT = void 0;
|
|
7
|
-
exports.filterByLanguage = filterByLanguage;
|
|
8
|
-
exports.getDbpediaDetails = getDbpediaDetails;
|
|
9
|
-
exports.getPreferredLanguages = getPreferredLanguages;
|
|
10
|
-
exports.getWikidataDetails = getWikidataDetails;
|
|
11
|
-
exports.getWikidataDetailsOld = getWikidataDetailsOld;
|
|
12
|
-
exports.getWikidataLocation = getWikidataLocation;
|
|
13
|
-
exports.loadFromBindings = loadFromBindings;
|
|
14
|
-
exports.loadPublicDataThing = loadPublicDataThing;
|
|
15
|
-
exports.predMap = void 0;
|
|
16
|
-
exports.queryESCODataByName = queryESCODataByName;
|
|
17
|
-
exports.queryPublicDataByName = queryPublicDataByName;
|
|
18
|
-
exports.queryPublicDataConstruct = queryPublicDataConstruct;
|
|
19
|
-
exports.queryPublicDataSelect = queryPublicDataSelect;
|
|
20
|
-
exports.wikidataParameters = exports.wikidataClasses = exports.wikidataClassMap = void 0;
|
|
21
|
-
var _rdflib = require("rdflib");
|
|
22
|
-
var _solidLogic = require("solid-logic");
|
|
23
|
-
var _solidUi = require("solid-ui");
|
|
24
|
-
/* Logic to access public data stores
|
|
25
|
-
*
|
|
26
|
-
* including filtering resut by natural language etc
|
|
27
|
-
*/
|
|
28
|
-
/* babel-plugin-inline-import './instituteDetailsQuery.sparql' */
|
|
29
|
-
const instituteDetailsQuery = "prefix vcard: <http://www.w3.org/2006/vcard/ns#>\nCONSTRUCT\n{ wd:Q49108 vcard:fn ?itemLabel.\nwd:Q49108 rdf:type ?klass. ?klass rdfs:label ?klassLabel; rdfs:comment ?klassDescription .\nwd:Q49108 schema:logo ?logo;\n schema:image ?image;\n schema:logo ?sealImage;\n schema:subOrganization ?subsidiary .\n ?subsidiary rdfs:label ?subsidiaryLabel .\n ?supersidiary schema:subOrganization wd:Q49108 .\n ?supersidiary rdfs:label ?supersidiaryLabel .\n wd:Q49108 schema:location ?location .\n ?location schema:elevation ?elevation .\n ?location wdt:P131 ?region . ?region rdfs:label ?regionLabel .\n ?location wdt:P625 ?coordinates .\n ?location schema:country ?country . ?country rdfs:label ?countryLabel .\n}\nWHERE\n{ optional {wd:Q49108 rdfs:label ?itemLabel} .\n optional {wd:Q49108 wdt:P154 ?logo .}\n optional {wd:Q49108 wdt:P31 ?klass .}\n optional {wd:Q49108 wdt:P158 ?sealImage .}\n optional {wd:Q49108 wdt:P18 ?image .}\n\n optional { wd:Q49108 wdt:P355 ?subsidiary . }\n optional { ?supersidiary wdt:P355 wd:Q49108. }\n\n optional { wd:Q49108 wdt:P276 ?location .\n\n optional { ?location schema:eleveation ?elevation }\n optional { ?location wdt:P131 ?region }\n optional { ?location wdt:P625 ?coordinates }\n optional { ?location wdt:P17 ?country }\n }\n SERVICE wikibase:label { bd:serviceParam wikibase:language \"fr,en,de,it\". }\n}\n";
|
|
30
|
-
const AUTOCOMPLETE_LIMIT = exports.AUTOCOMPLETE_LIMIT = 3000; // How many to get from server
|
|
31
|
-
|
|
32
|
-
const subjectRegexp = /\$\(subject\)/g;
|
|
33
|
-
// Schema.org seems to suggest NGOs are non-profit and Corporaions are for-profit
|
|
34
|
-
// but doesn't have explicit classes
|
|
35
|
-
const wikidataClasses = exports.wikidataClasses = {
|
|
36
|
-
Corporation: 'http://www.wikidata.org/entity/Q6881511',
|
|
37
|
-
// Enterprise is for-profit
|
|
38
|
-
EducationalOrganization: 'http://www.wikidata.org/entity/Q178706',
|
|
39
|
-
// insitution
|
|
40
|
-
GovernmentOrganization: 'http://www.wikidata.org/entity/Q327333',
|
|
41
|
-
// government agency
|
|
42
|
-
MedicalOrganization: 'http://www.wikidata.org/entity/Q4287745',
|
|
43
|
-
MusicGroup: 'http://www.wikidata.org/entity/Q32178211',
|
|
44
|
-
// music organization
|
|
45
|
-
NGO: 'http://www.wikidata.org/entity/Q163740',
|
|
46
|
-
// nonprofit organization @@
|
|
47
|
-
Occupation: 'http://www.wikidata.org/entity/Q28640',
|
|
48
|
-
// Profession
|
|
49
|
-
// Organization: 'http://www.wikidata.org/entity/Q43229',
|
|
50
|
-
Project: 'http://www.wikidata.org/entity/Q170584',
|
|
51
|
-
SportsOrganization: 'http://www.wikidata.org/entity/Q4438121'
|
|
52
|
-
};
|
|
53
|
-
async function getPreferredLanguages() {
|
|
54
|
-
return ['fr', 'en', 'de', 'it']; // @@ testing only -- code me later
|
|
55
|
-
}
|
|
56
|
-
const escoParameters = exports.escoParameters = {
|
|
57
|
-
label: 'ESCO',
|
|
58
|
-
logo: 'https://ec.europa.eu/esco/portal/static_resource2/images/logo/logo_en.gif',
|
|
59
|
-
searchByNameQuery: undefined,
|
|
60
|
-
// No sparql endpoint
|
|
61
|
-
searchByNameURI: 'https://ec.europa.eu/esco/api/search?language=$(language)&type=occupation&text=$(name)',
|
|
62
|
-
endpoint: undefined,
|
|
63
|
-
class: {}
|
|
64
|
-
};
|
|
65
|
-
const dbpediaParameters = exports.dbpediaParameters = {
|
|
66
|
-
label: 'DBPedia',
|
|
67
|
-
logo: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/DBpediaLogo.svg/263px-DBpediaLogo.svg.png',
|
|
68
|
-
searchByNameQuery: `select distinct ?subject, ?name where {
|
|
69
|
-
?subject a $(class); rdfs:label ?name
|
|
70
|
-
FILTER regex(?name, "$(name)", "i")
|
|
71
|
-
} LIMIT $(limit)`,
|
|
72
|
-
endpoint: 'https://dbpedia.org/sparql/',
|
|
73
|
-
class: {
|
|
74
|
-
AcademicInsitution: 'http://umbel.org/umbel/rc/EducationalOrganization'
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
const wikidataParameters = exports.wikidataParameters = {
|
|
78
|
-
label: 'WikiData',
|
|
79
|
-
logo: 'https://www.wikimedia.org/static/images/project-logos/wikidatawiki.png',
|
|
80
|
-
endpoint: 'https://query.wikidata.org/sparql',
|
|
81
|
-
class: {
|
|
82
|
-
AcademicInsitution: 'http://www.wikidata.org/entity/Q4671277',
|
|
83
|
-
Enterprise: 'http://www.wikidata.org/entity/Q6881511',
|
|
84
|
-
Business: 'http://www.wikidata.org/entity/Q4830453',
|
|
85
|
-
NGO: 'http://www.wikidata.org/entity/Q79913',
|
|
86
|
-
CharitableOrganization: 'http://www.wikidata.org/entity/Q708676',
|
|
87
|
-
Insitute: 'http://www.wikidata.org/entity/Q1664720'
|
|
88
|
-
},
|
|
89
|
-
searchByNameQuery: `SELECT ?subject ?name
|
|
90
|
-
WHERE {
|
|
91
|
-
?klass wdt:P279* $(class) .
|
|
92
|
-
?subject wdt:P31 ?klass .
|
|
93
|
-
?subject rdfs:label ?name.
|
|
94
|
-
FILTER regex(?name, "$(name)", "i")
|
|
95
|
-
} LIMIT $(limit) `,
|
|
96
|
-
// was SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en" }
|
|
97
|
-
|
|
98
|
-
insitituteDetailsQuery: `CONSTRUCT
|
|
99
|
-
{ wd:Q49108 schema:name ?itemLabel;
|
|
100
|
-
schema:logo ?logo;
|
|
101
|
-
schema:logo ?sealImage;
|
|
102
|
-
schema:subOrganization ?subsidiary .
|
|
103
|
-
?subsidiary schema:name ?subsidiaryLabel .
|
|
104
|
-
}
|
|
105
|
-
WHERE
|
|
106
|
-
{
|
|
107
|
-
wd:Q49108 # rdfs:label ?itemLabel ;
|
|
108
|
-
wdt:P154 ?logo;
|
|
109
|
-
wdt:P158 ?sealImage ;
|
|
110
|
-
wdt:P355 ?subsidiary .
|
|
111
|
-
# ?subsidiary rdfs:label ?subsidiaryLabel .
|
|
112
|
-
|
|
113
|
-
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE], fr". }
|
|
114
|
-
}`
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
/* From an array of bindings with a names for each row,
|
|
118
|
-
* remove dupliacte names for the same thing, leaving the user's
|
|
119
|
-
* preferred language version
|
|
120
|
-
*/
|
|
121
|
-
function filterByLanguage(bindings, languagePrefs) {
|
|
122
|
-
const uris = {};
|
|
123
|
-
bindings.forEach(binding => {
|
|
124
|
-
// Organize names by their subject
|
|
125
|
-
const uri = binding.subject.value;
|
|
126
|
-
uris[uri] = uris[uri] || [];
|
|
127
|
-
uris[uri].push(binding);
|
|
128
|
-
});
|
|
129
|
-
const languagePrefs2 = languagePrefs;
|
|
130
|
-
languagePrefs2.reverse(); // prefered last
|
|
131
|
-
|
|
132
|
-
const slimmed = [];
|
|
133
|
-
for (const u in uris) {
|
|
134
|
-
// needs hasOwnProperty ?
|
|
135
|
-
const bindings = uris[u];
|
|
136
|
-
const sortMe = bindings.map(binding => {
|
|
137
|
-
return [languagePrefs2.indexOf(binding.name?.['xml:lang'] || ''), binding];
|
|
138
|
-
});
|
|
139
|
-
sortMe.sort(); // best at th ebottom
|
|
140
|
-
sortMe.reverse(); // best at the top
|
|
141
|
-
slimmed.push(sortMe[0][1]);
|
|
142
|
-
} // map u
|
|
143
|
-
console.log(` Filter by language: ${bindings.length} -> ${slimmed.length}`);
|
|
144
|
-
return slimmed;
|
|
145
|
-
}
|
|
146
|
-
var wikidataClassMap = exports.wikidataClassMap = {
|
|
147
|
-
'http://www.wikidata.org/entity/Q15936437': _solidUi.ns.schema('CollegeOrUniversity'),
|
|
148
|
-
// research university
|
|
149
|
-
'http://www.wikidata.org/entity/Q1664720': _solidUi.ns.schema('EducationalOrganization'),
|
|
150
|
-
// insitute @@
|
|
151
|
-
'http://www.wikidata.org/entity/Q43229': _solidUi.ns.schema('Organization'),
|
|
152
|
-
// research university
|
|
153
|
-
'http://www.wikidata.org/entity/Q3918': _solidUi.ns.schema('CollegeOrUniversity'),
|
|
154
|
-
// university
|
|
155
|
-
'http://www.wikidata.org/entity/Q170584': _solidUi.ns.schema('Project'),
|
|
156
|
-
// university
|
|
157
|
-
'http://www.wikidata.org/entity/Q327333': _solidUi.ns.schema('GovernmentOrganization'),
|
|
158
|
-
// gobvt agency
|
|
159
|
-
'http://www.wikidata.org/entity/Q2221906': _solidUi.ns.schema('Place') // geographic location
|
|
160
|
-
};
|
|
161
|
-
var predMap = exports.predMap = {
|
|
162
|
-
// allow other mappings top added in theory
|
|
163
|
-
class: _solidUi.ns.rdf('type'),
|
|
164
|
-
// logo: ns.schema('logo'),
|
|
165
|
-
sealImage: _solidUi.ns.schema('logo'),
|
|
166
|
-
// image: ns.schema('image'), defaults to shema
|
|
167
|
-
shortName: _solidUi.ns.foaf('nick'),
|
|
168
|
-
subsidiary: _solidUi.ns.schema('subOrganization')
|
|
169
|
-
};
|
|
170
|
-
function loadFromBindings(kb, solidSubject, bindings, doc) {
|
|
171
|
-
const results = {};
|
|
172
|
-
console.log(`loadFromBindings: subject: ${solidSubject}`);
|
|
173
|
-
console.log(` doc: ${doc}`);
|
|
174
|
-
bindings.forEach(binding => {
|
|
175
|
-
for (const key in binding) {
|
|
176
|
-
const result = binding[key];
|
|
177
|
-
const combined = JSON.stringify(result); // ( result.type, result.value )
|
|
178
|
-
results[key] = results[key] || new Set();
|
|
179
|
-
results[key].add(combined); // remove duplicates
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
|
-
for (const key in results) {
|
|
183
|
-
const values = results[key];
|
|
184
|
-
console.log(` results ${key} -> ${values}`);
|
|
185
|
-
values.forEach(combined => {
|
|
186
|
-
const result = JSON.parse(combined);
|
|
187
|
-
const {
|
|
188
|
-
type,
|
|
189
|
-
value
|
|
190
|
-
} = result;
|
|
191
|
-
let obj;
|
|
192
|
-
if (type === 'uri') {
|
|
193
|
-
obj = kb.sym(value);
|
|
194
|
-
} else if (type === 'literal') {
|
|
195
|
-
obj = new _rdflib.Literal(value, result.language, result.datatype);
|
|
196
|
-
} else {
|
|
197
|
-
throw new Error(`loadFromBindings: unexpected type: ${type}`);
|
|
198
|
-
}
|
|
199
|
-
if (key === 'type') {
|
|
200
|
-
if (wikidataClassMap[value]) {
|
|
201
|
-
obj = wikidataClassMap[value];
|
|
202
|
-
} else {
|
|
203
|
-
console.warn('Unmapped Wikidata Class: ' + value);
|
|
204
|
-
}
|
|
205
|
-
} else if (key === 'coordinates') {
|
|
206
|
-
// const latlong = value // Like 'Point(-71.106111111 42.375)'
|
|
207
|
-
console.log(' @@@ hey a point: ' + value);
|
|
208
|
-
// eslint-disable-next-line no-useless-escape
|
|
209
|
-
const regexp = /.*\(([-0-9\.-]*) ([-0-9\.-]*)\)/;
|
|
210
|
-
const match = regexp.exec(value);
|
|
211
|
-
if (match) {
|
|
212
|
-
const float = _solidUi.ns.xsd('float');
|
|
213
|
-
const latitude = new _rdflib.Literal(match[1], null, float);
|
|
214
|
-
const longitude = new _rdflib.Literal(match[2], null, float);
|
|
215
|
-
kb.add(solidSubject, _solidUi.ns.schema('longitude'), longitude, doc);
|
|
216
|
-
kb.add(solidSubject, _solidUi.ns.schema('latitude'), latitude, doc);
|
|
217
|
-
}
|
|
218
|
-
} else if (predMap[key]) {
|
|
219
|
-
const pred = predMap[key] || _solidUi.ns.schema(key); // fallback to just using schema.org
|
|
220
|
-
kb.add(solidSubject, pred, obj, doc); // @@ deal with non-string and objects
|
|
221
|
-
console.log(` public data ${pred} ${obj}.`);
|
|
222
|
-
}
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
/* ESCO sopecific
|
|
228
|
-
*/
|
|
229
|
-
|
|
230
|
-
/* Query all entities of given class and partially matching name
|
|
231
|
-
*/
|
|
232
|
-
async function queryESCODataByName(filter, theClass, queryTarget) {
|
|
233
|
-
if (!queryTarget.searchByNameURI) {
|
|
234
|
-
throw new Error('Query target searchByNameURI is required for ESCO queries');
|
|
235
|
-
}
|
|
236
|
-
const queryURI = queryTarget.searchByNameURI.replace('$(name)', filter).replace('$(limit)', '' + AUTOCOMPLETE_LIMIT).replace('$(class)', theClass.uri);
|
|
237
|
-
console.log('Querying ESCO data - uri: ' + queryURI);
|
|
238
|
-
const options = {
|
|
239
|
-
credentials: 'omit',
|
|
240
|
-
headers: {
|
|
241
|
-
Accept: 'application/json'
|
|
242
|
-
}
|
|
243
|
-
}; // CORS
|
|
244
|
-
const response = await _solidLogic.store.fetcher.webOperation('GET', queryURI, options);
|
|
245
|
-
// complain('Error querying db of organizations: ' + err)
|
|
246
|
-
const text = response.responseText;
|
|
247
|
-
if (!text) throw new Error('No response text from ESCO query ' + queryURI);
|
|
248
|
-
console.log(' Query result text' + text.slice(0, 500) + '...');
|
|
249
|
-
if (text.length === 0) throw new Error('Wot no text back from ESCO query ' + queryURI);
|
|
250
|
-
const json = JSON.parse(text);
|
|
251
|
-
console.log(' Query result JSON' + JSON.stringify(json, null, 4).slice(0, 500) + '...');
|
|
252
|
-
const results = json._embedded.results; // Array
|
|
253
|
-
const bindings = results.map(result => {
|
|
254
|
-
const name = result.title;
|
|
255
|
-
const uri = result.uri; // like http://data.europa.eu/esco/occupation/57af9090-55b4-4911-b2d0-86db01c00b02
|
|
256
|
-
return {
|
|
257
|
-
name: {
|
|
258
|
-
value: name,
|
|
259
|
-
type: 'literal'
|
|
260
|
-
},
|
|
261
|
-
uri: {
|
|
262
|
-
type: 'IRI',
|
|
263
|
-
value: uri
|
|
264
|
-
}
|
|
265
|
-
}; // simulate SPARQL bindings
|
|
266
|
-
});
|
|
267
|
-
return bindings;
|
|
268
|
-
// return queryPublicDataSelect(sparql, queryTarget)
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
/* Query all entities of given class and partially matching name
|
|
272
|
-
*/
|
|
273
|
-
async function queryPublicDataByName(filter, theClass, queryTarget) {
|
|
274
|
-
const sparql = queryTarget.searchByNameQuery.replace('$(name)', filter).replace('$(limit)', '' + AUTOCOMPLETE_LIMIT).replace('$(class)', theClass.uri);
|
|
275
|
-
console.log('Querying public data - sparql: ' + sparql);
|
|
276
|
-
return queryPublicDataSelect(sparql, queryTarget);
|
|
277
|
-
}
|
|
278
|
-
async function queryPublicDataSelect(sparql, queryTarget) {
|
|
279
|
-
if (!queryTarget.endpoint) {
|
|
280
|
-
throw new Error('Query target endpoint is required');
|
|
281
|
-
}
|
|
282
|
-
const myUrlWithParams = new URL(queryTarget.endpoint);
|
|
283
|
-
myUrlWithParams.searchParams.append('query', sparql);
|
|
284
|
-
const queryURI = myUrlWithParams.href;
|
|
285
|
-
console.log(' queryPublicDataSelect uri: ' + queryURI);
|
|
286
|
-
const options = {
|
|
287
|
-
credentials: 'omit',
|
|
288
|
-
headers: {
|
|
289
|
-
Accept: 'application/json'
|
|
290
|
-
}
|
|
291
|
-
}; // CORS
|
|
292
|
-
const response = await _solidLogic.store.fetcher.webOperation('GET', queryURI, options);
|
|
293
|
-
// complain('Error querying db of organizations: ' + err)
|
|
294
|
-
const text = response.responseText;
|
|
295
|
-
// console.log(' Query result text' + text.slice(0,100) + '...')
|
|
296
|
-
if (!text || text.length === 0) {
|
|
297
|
-
throw new Error('Wot no text back from query ' + queryURI);
|
|
298
|
-
} else {
|
|
299
|
-
const json = JSON.parse(text);
|
|
300
|
-
console.log(' Query result JSON' + JSON.stringify(json, null, 4).slice(0, 100) + '...');
|
|
301
|
-
const bindings = json.results.bindings;
|
|
302
|
-
return bindings;
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
async function queryPublicDataConstruct(sparql, publicId, queryTarget) {
|
|
306
|
-
console.log('queryPublicDataConstruct: sparql:', sparql);
|
|
307
|
-
if (!queryTarget.endpoint) {
|
|
308
|
-
throw new Error('Query target endpoint is required');
|
|
309
|
-
}
|
|
310
|
-
const myUrlWithParams = new URL(queryTarget.endpoint);
|
|
311
|
-
myUrlWithParams.searchParams.append('query', sparql);
|
|
312
|
-
const queryURI = myUrlWithParams.href;
|
|
313
|
-
console.log(' queryPublicDataConstruct uri: ' + queryURI);
|
|
314
|
-
const options = {
|
|
315
|
-
credentials: 'omit',
|
|
316
|
-
// CORS
|
|
317
|
-
headers: {
|
|
318
|
-
Accept: 'text/turtle'
|
|
319
|
-
}
|
|
320
|
-
};
|
|
321
|
-
const response = await _solidLogic.store.fetcher.webOperation('GET', queryURI, options);
|
|
322
|
-
const text = response.responseText;
|
|
323
|
-
const report = text && text.length > 500 ? text.slice(0, 200) + ' ... ' + text.slice(-200) : text;
|
|
324
|
-
console.log(' queryPublicDataConstruct result text:' + report);
|
|
325
|
-
if (!text || text.length === 0) {
|
|
326
|
-
throw new Error('queryPublicDataConstruct: No text back from construct query:' + queryURI);
|
|
327
|
-
} else {
|
|
328
|
-
(0, _rdflib.parse)(text, _solidLogic.store, publicId.uri, 'text/turtle');
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
async function loadPublicDataThing(kb, subject, publicDataID) {
|
|
332
|
-
if (publicDataID.uri.startsWith('https://dbpedia.org/resource/')) {
|
|
333
|
-
return getDbpediaDetails(kb, subject, publicDataID);
|
|
334
|
-
} else if (publicDataID.uri.match(/^https?:\/\/www\.wikidata\.org\/entity\/.*/)) {
|
|
335
|
-
// Previous approach:
|
|
336
|
-
// const QId = publicDataID.uri.split('/')[4]
|
|
337
|
-
// const dataURI = `http://www.wikidata.org/wiki/Special:EntityData/${QId}.ttl`
|
|
338
|
-
// Not used because loading the data URI gives much too much irrelevant data from Wikidata.
|
|
339
|
-
await getWikidataDetails(kb, subject, publicDataID);
|
|
340
|
-
// await getWikidataLocation(kb, subject, publicDataID) -- should get that in the details query now
|
|
341
|
-
} else {
|
|
342
|
-
const iDToFetch = publicDataID.uri.startsWith('http:') ? kb.sym('https:' + publicDataID.uri.slice(5)) : publicDataID;
|
|
343
|
-
return kb.fetcher.load(iDToFetch, {
|
|
344
|
-
credentials: 'omit',
|
|
345
|
-
headers: {
|
|
346
|
-
Accept: 'text/turtle'
|
|
347
|
-
}
|
|
348
|
-
});
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
async function getWikidataDetails(kb, solidSubject, publicDataID) {
|
|
352
|
-
const subjRegexp = /wd:Q49108/g;
|
|
353
|
-
const sparql = instituteDetailsQuery.replace(subjRegexp, publicDataID.value);
|
|
354
|
-
await queryPublicDataConstruct(sparql, publicDataID, wikidataParameters);
|
|
355
|
-
console.log('getWikidataDetails: loaded.', publicDataID);
|
|
356
|
-
}
|
|
357
|
-
async function getWikidataDetailsOld(kb, solidSubject, publicDataID) {
|
|
358
|
-
const sparql = `select distinct * where {
|
|
359
|
-
optional { $(subject) wdt:P31 ?class } # instance of
|
|
360
|
-
optional { $(subject) wdt:P154 ?logo }
|
|
361
|
-
optional { $(subject) wdt:P158 ?sealImage }
|
|
362
|
-
# optional { $(subject) wdt:P159 ?headquartersLocation }
|
|
363
|
-
|
|
364
|
-
optional { $(subject) wdt:P17 ?country }
|
|
365
|
-
optional { $(subject) wdt:P18 ?image }
|
|
366
|
-
optional { $(subject) wdt:P1813 ?shortName }
|
|
367
|
-
|
|
368
|
-
optional { $(subject) wdt:P355 ?subsidiary }
|
|
369
|
-
# SERVICE wikibase:label { bd:serviceParam wikibase:language "fr,en,de,it" }
|
|
370
|
-
}`.replace(subjectRegexp, publicDataID.uri);
|
|
371
|
-
const bindings = await queryPublicDataSelect(sparql, wikidataParameters);
|
|
372
|
-
loadFromBindings(kb, publicDataID, bindings, publicDataID.doc()); // arg2 was solidSubject
|
|
373
|
-
}
|
|
374
|
-
async function getWikidataLocation(kb, solidSubject, publicDataID) {
|
|
375
|
-
const sparql = `select distinct * where {
|
|
376
|
-
|
|
377
|
-
$(subject) wdt:P276 ?location .
|
|
378
|
-
|
|
379
|
-
optional { ?location wdt:P2044 ?elevation }
|
|
380
|
-
optional { ?location wdt:P131 ?region }
|
|
381
|
-
optional { ?location wdt:P625 ?coordinates }
|
|
382
|
-
optional { ?location wdt:P17 ?country }
|
|
383
|
-
|
|
384
|
-
# SERVICE wikibase:label { bd:serviceParam wikibase:language "fr,en,de,it" }
|
|
385
|
-
}`.replace(subjectRegexp, publicDataID.uri);
|
|
386
|
-
console.log(' location query sparql:' + sparql);
|
|
387
|
-
const bindings = await queryPublicDataSelect(sparql, wikidataParameters);
|
|
388
|
-
console.log(' location query bindings:', bindings);
|
|
389
|
-
loadFromBindings(kb, publicDataID, bindings, publicDataID.doc()); // was solidSubject
|
|
390
|
-
}
|
|
391
|
-
async function getDbpediaDetails(kb, solidSubject, publicDataID) {
|
|
392
|
-
// Note below the string form of the named node with <> works in SPARQL
|
|
393
|
-
const sparql = `select distinct ?city, ?state, ?country, ?homepage, ?logo, ?lat, ?long, WHERE {
|
|
394
|
-
OPTIONAL { <${publicDataID}> <http://dbpedia.org/ontology/city> ?city }
|
|
395
|
-
OPTIONAL { ${publicDataID} <http://dbpedia.org/ontology/state> ?state }
|
|
396
|
-
OPTIONAL { ${publicDataID} <http://dbpedia.org/ontology/country> ?country }
|
|
397
|
-
OPTIONAL { ${publicDataID} foaf:homepage ?homepage }
|
|
398
|
-
OPTIONAL { ${publicDataID} foaf:lat ?lat; foaf:long ?long }
|
|
399
|
-
OPTIONAL { ${publicDataID} <http://dbpedia.org/ontology/country> ?country }
|
|
400
|
-
}`;
|
|
401
|
-
/*
|
|
402
|
-
const predMap = {
|
|
403
|
-
city: ns.vcard('locality'),
|
|
404
|
-
state: ns.vcard('region'),
|
|
405
|
-
country: ns.vcard('country-name'),
|
|
406
|
-
homepage: ns.foaf('homepage'),
|
|
407
|
-
lat: ns.geo('latitude'),
|
|
408
|
-
long: ns.geo('longitude'),
|
|
409
|
-
}
|
|
410
|
-
*/
|
|
411
|
-
const bindings = await queryPublicDataSelect(sparql, dbpediaParameters);
|
|
412
|
-
return bindings.map(binding => {
|
|
413
|
-
const uri = binding.subject.value; // @@ To be written
|
|
414
|
-
const name = binding.name?.value;
|
|
415
|
-
return {
|
|
416
|
-
uri,
|
|
417
|
-
name
|
|
418
|
-
};
|
|
419
|
-
});
|
|
420
|
-
}
|
|
421
|
-
//# sourceMappingURL=publicData.js.map
|
package/dist/publicData.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"publicData.js","names":["_rdflib","require","_solidLogic","_solidUi","instituteDetailsQuery","AUTOCOMPLETE_LIMIT","exports","subjectRegexp","wikidataClasses","Corporation","EducationalOrganization","GovernmentOrganization","MedicalOrganization","MusicGroup","NGO","Occupation","Project","SportsOrganization","getPreferredLanguages","escoParameters","label","logo","searchByNameQuery","undefined","searchByNameURI","endpoint","class","dbpediaParameters","AcademicInsitution","wikidataParameters","Enterprise","Business","CharitableOrganization","Insitute","insitituteDetailsQuery","filterByLanguage","bindings","languagePrefs","uris","forEach","binding","uri","subject","value","push","languagePrefs2","reverse","slimmed","u","sortMe","map","indexOf","name","sort","console","log","length","wikidataClassMap","ns","schema","predMap","rdf","sealImage","shortName","foaf","subsidiary","loadFromBindings","kb","solidSubject","doc","results","key","result","combined","JSON","stringify","Set","add","values","parse","type","obj","sym","Literal","language","datatype","Error","warn","regexp","match","exec","float","xsd","latitude","longitude","pred","queryESCODataByName","filter","theClass","queryTarget","queryURI","replace","options","credentials","headers","Accept","response","store","fetcher","webOperation","text","responseText","slice","json","_embedded","title","queryPublicDataByName","sparql","queryPublicDataSelect","myUrlWithParams","URL","searchParams","append","href","queryPublicDataConstruct","publicId","report","loadPublicDataThing","publicDataID","startsWith","getDbpediaDetails","getWikidataDetails","iDToFetch","load","subjRegexp","getWikidataDetailsOld","getWikidataLocation"],"sources":["../src/publicData.ts"],"sourcesContent":["/* Logic to access public data stores\n*\n* including filtering resut by natural language etc\n*/\nimport { Literal, NamedNode, parse } from 'rdflib'\nimport { store } from 'solid-logic'\nimport { ns } from 'solid-ui'\nimport instituteDetailsQuery from './instituteDetailsQuery.sparql'\n\nexport const AUTOCOMPLETE_LIMIT = 3000 // How many to get from server\n\nconst subjectRegexp = /\\$\\(subject\\)/g\n\ninterface Term {\n type: string;\n value: string\n}\n\ninterface Binding {\n subject: Term;\n name?: Term\n location?: Term\n coordinates?: Term\n}\n\ntype Bindings = Binding[]\n\nexport type QueryParameters =\n{\n label: string;\n logo: string;\n searchByNameQuery?: string;\n searchByNameURI?: string;\n insitituteDetailsQuery?: string;\n endpoint?: string;\n class: object\n}\n\n// Schema.org seems to suggest NGOs are non-profit and Corporaions are for-profit\n// but doesn't have explicit classes\nexport const wikidataClasses = {\n Corporation: 'http://www.wikidata.org/entity/Q6881511', // Enterprise is for-profit\n EducationalOrganization: 'http://www.wikidata.org/entity/Q178706', // insitution\n GovernmentOrganization: 'http://www.wikidata.org/entity/Q327333', // government agency\n MedicalOrganization: 'http://www.wikidata.org/entity/Q4287745',\n MusicGroup: 'http://www.wikidata.org/entity/Q32178211', // music organization\n NGO: 'http://www.wikidata.org/entity/Q163740', // nonprofit organization @@\n Occupation: 'http://www.wikidata.org/entity/Q28640', // Profession\n // Organization: 'http://www.wikidata.org/entity/Q43229',\n Project: 'http://www.wikidata.org/entity/Q170584',\n SportsOrganization: 'http://www.wikidata.org/entity/Q4438121',\n}\n\nexport async function getPreferredLanguages () {\n return ['fr', 'en', 'de', 'it'] // @@ testing only -- code me later\n}\nexport const escoParameters:QueryParameters = {\n label: 'ESCO',\n logo: 'https://ec.europa.eu/esco/portal/static_resource2/images/logo/logo_en.gif',\n searchByNameQuery: undefined, // No sparql endpoint\n searchByNameURI: 'https://ec.europa.eu/esco/api/search?language=$(language)&type=occupation&text=$(name)',\n endpoint: undefined,\n class: {}\n}\n\nexport const dbpediaParameters:QueryParameters = {\n label: 'DBPedia',\n logo: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/DBpediaLogo.svg/263px-DBpediaLogo.svg.png',\n searchByNameQuery: `select distinct ?subject, ?name where {\n ?subject a $(class); rdfs:label ?name\n FILTER regex(?name, \"$(name)\", \"i\")\n } LIMIT $(limit)`,\n endpoint: 'https://dbpedia.org/sparql/',\n class: { AcademicInsitution: 'http://umbel.org/umbel/rc/EducationalOrganization' }\n}\n\nexport const wikidataParameters = {\n label: 'WikiData',\n logo: 'https://www.wikimedia.org/static/images/project-logos/wikidatawiki.png',\n endpoint: 'https://query.wikidata.org/sparql',\n class: {\n AcademicInsitution: 'http://www.wikidata.org/entity/Q4671277',\n Enterprise: 'http://www.wikidata.org/entity/Q6881511',\n Business: 'http://www.wikidata.org/entity/Q4830453',\n NGO: 'http://www.wikidata.org/entity/Q79913',\n CharitableOrganization: 'http://www.wikidata.org/entity/Q708676',\n Insitute: 'http://www.wikidata.org/entity/Q1664720',\n },\n searchByNameQuery: `SELECT ?subject ?name\n WHERE {\n ?klass wdt:P279* $(class) .\n ?subject wdt:P31 ?klass .\n ?subject rdfs:label ?name.\n FILTER regex(?name, \"$(name)\", \"i\")\n } LIMIT $(limit) `, // was SERVICE wikibase:label { bd:serviceParam wikibase:language \"[AUTO_LANGUAGE],en\" }\n\n insitituteDetailsQuery: `CONSTRUCT\n{ wd:Q49108 schema:name ?itemLabel;\n schema:logo ?logo;\n schema:logo ?sealImage;\n schema:subOrganization ?subsidiary .\n ?subsidiary schema:name ?subsidiaryLabel .\n}\nWHERE\n{\n wd:Q49108 # rdfs:label ?itemLabel ;\n wdt:P154 ?logo;\n wdt:P158 ?sealImage ;\n wdt:P355 ?subsidiary .\n # ?subsidiary rdfs:label ?subsidiaryLabel .\n\n SERVICE wikibase:label { bd:serviceParam wikibase:language \"[AUTO_LANGUAGE], fr\". }\n}`\n}\n\n/* From an array of bindings with a names for each row,\n * remove dupliacte names for the same thing, leaving the user's\n * preferred language version\n*/\nexport function filterByLanguage (bindings: Bindings, languagePrefs: string[]): Bindings {\n const uris: Record<string, Binding[]> = {}\n bindings.forEach(binding => { // Organize names by their subject\n const uri = binding.subject.value\n uris[uri] = uris[uri] || []\n uris[uri].push(binding)\n })\n\n const languagePrefs2 = languagePrefs\n languagePrefs2.reverse() // prefered last\n\n const slimmed: Binding[] = []\n for (const u in uris) { // needs hasOwnProperty ?\n const bindings = uris[u]\n const sortMe = bindings.map(binding => {\n return [languagePrefs2.indexOf(binding.name?.['xml:lang'] || ''), binding]\n })\n sortMe.sort() // best at th ebottom\n sortMe.reverse() // best at the top\n slimmed.push(sortMe[0][1] as Binding)\n } // map u\n console.log(` Filter by language: ${bindings.length} -> ${slimmed.length}`)\n return slimmed\n}\n\nexport var wikidataClassMap = {\n 'http://www.wikidata.org/entity/Q15936437': ns.schema('CollegeOrUniversity'), // research university\n 'http://www.wikidata.org/entity/Q1664720': ns.schema('EducationalOrganization'), // insitute @@\n 'http://www.wikidata.org/entity/Q43229': ns.schema('Organization'), // research university\n 'http://www.wikidata.org/entity/Q3918': ns.schema('CollegeOrUniversity'), // university\n 'http://www.wikidata.org/entity/Q170584': ns.schema('Project'), // university\n 'http://www.wikidata.org/entity/Q327333': ns.schema('GovernmentOrganization'), // gobvt agency\n 'http://www.wikidata.org/entity/Q2221906': ns.schema('Place'), // geographic location\n\n}\nexport var predMap = { // allow other mappings top added in theory\n class: ns.rdf('type'),\n // logo: ns.schema('logo'),\n sealImage: ns.schema('logo'),\n // image: ns.schema('image'), defaults to shema\n shortName: ns.foaf('nick'),\n subsidiary: ns.schema('subOrganization')\n}\n\nexport function loadFromBindings (kb, solidSubject:NamedNode, bindings, doc) {\n const results = {}\n console.log(`loadFromBindings: subject: ${solidSubject}`)\n console.log(` doc: ${doc}`)\n bindings.forEach(binding => {\n for (const key in binding) {\n const result = binding[key]\n const combined = JSON.stringify(result) // ( result.type, result.value )\n results[key] = results[key] || new Set()\n results[key].add(combined) // remove duplicates\n }\n })\n for (const key in results) {\n const values = results[key]\n console.log(` results ${key} -> ${values}`)\n values.forEach(combined => {\n const result = JSON.parse(combined)\n const { type, value } = result\n let obj\n if (type === 'uri') {\n obj = kb.sym(value)\n } else if (type === 'literal') {\n obj = new Literal(value, result.language, result.datatype)\n } else {\n throw new Error(`loadFromBindings: unexpected type: ${type}`)\n }\n if (key === 'type') {\n if (wikidataClassMap[value]) {\n obj = wikidataClassMap[value]\n } else {\n console.warn('Unmapped Wikidata Class: ' + value)\n }\n } else if (key === 'coordinates') {\n // const latlong = value // Like 'Point(-71.106111111 42.375)'\n console.log(' @@@ hey a point: ' + value)\n // eslint-disable-next-line no-useless-escape\n const regexp = /.*\\(([-0-9\\.-]*) ([-0-9\\.-]*)\\)/\n const match = regexp.exec(value)\n if (match) {\n const float = ns.xsd('float')\n const latitude = new Literal(match[1], null, float)\n const longitude = new Literal(match[2], null, float)\n kb.add(solidSubject, ns.schema('longitude'), longitude, doc)\n kb.add(solidSubject, ns.schema('latitude'), latitude, doc)\n }\n } else if (predMap[key]) {\n const pred = predMap[key] || ns.schema(key) // fallback to just using schema.org\n kb.add(solidSubject, pred, obj, doc) // @@ deal with non-string and objects\n console.log(` public data ${pred} ${obj}.`)\n }\n })\n }\n}\n\n/* ESCO sopecific\n*/\n\n/* Query all entities of given class and partially matching name\n*/\nexport async function queryESCODataByName (filter: string, theClass:NamedNode, queryTarget: QueryParameters): Promise<Bindings> {\n if (!queryTarget.searchByNameURI) {\n throw new Error('Query target searchByNameURI is required for ESCO queries')\n }\n const queryURI = queryTarget.searchByNameURI\n .replace('$(name)', filter)\n .replace('$(limit)', '' + AUTOCOMPLETE_LIMIT)\n .replace('$(class)', theClass.uri)\n console.log('Querying ESCO data - uri: ' + queryURI)\n\n const options = {\n credentials: 'omit' as const,\n headers: { Accept: 'application/json' }\n } // CORS\n const response = await store.fetcher.webOperation('GET', queryURI, options)\n // complain('Error querying db of organizations: ' + err)\n const text = response.responseText\n if (!text) throw new Error('No response text from ESCO query ' + queryURI)\n console.log(' Query result text' + text.slice(0, 500) + '...')\n if (text.length === 0) throw new Error('Wot no text back from ESCO query ' + queryURI)\n const json = JSON.parse(text)\n console.log(' Query result JSON' + JSON.stringify(json, null, 4).slice(0, 500) + '...')\n\n const results = json._embedded.results // Array\n const bindings = results.map(result => {\n const name = result.title\n const uri = result.uri // like http://data.europa.eu/esco/occupation/57af9090-55b4-4911-b2d0-86db01c00b02\n return { name: { value: name, type: 'literal' }, uri: { type: 'IRI', value: uri } } // simulate SPARQL bindings\n })\n return bindings\n // return queryPublicDataSelect(sparql, queryTarget)\n}\n\n/* Query all entities of given class and partially matching name\n*/\nexport async function queryPublicDataByName (filter: string, theClass:NamedNode, queryTarget: QueryParameters): Promise<Bindings> {\n const sparql = queryTarget.searchByNameQuery!\n .replace('$(name)', filter)\n .replace('$(limit)', '' + AUTOCOMPLETE_LIMIT)\n .replace('$(class)', theClass.uri)\n console.log('Querying public data - sparql: ' + sparql)\n return queryPublicDataSelect(sparql, queryTarget)\n}\n\nexport async function queryPublicDataSelect (sparql: string, queryTarget: QueryParameters): Promise<Bindings> {\n if (!queryTarget.endpoint) {\n throw new Error('Query target endpoint is required')\n }\n const myUrlWithParams = new URL(queryTarget.endpoint!)\n myUrlWithParams.searchParams.append('query', sparql)\n const queryURI = myUrlWithParams.href\n console.log(' queryPublicDataSelect uri: ' + queryURI)\n\n const options = {\n credentials: 'omit' as const,\n headers: { Accept: 'application/json' }\n } // CORS\n const response = await store.fetcher.webOperation('GET', queryURI, options)\n // complain('Error querying db of organizations: ' + err)\n const text = response.responseText\n // console.log(' Query result text' + text.slice(0,100) + '...')\n if (!text || text.length === 0) { throw new Error('Wot no text back from query ' + queryURI) } else {\n const json = JSON.parse(text)\n console.log(' Query result JSON' + JSON.stringify(json, null, 4).slice(0, 100) + '...')\n const bindings = json.results.bindings\n return bindings\n }\n}\n\nexport async function queryPublicDataConstruct (sparql: string, publicId: NamedNode, queryTarget: QueryParameters): Promise<void> {\n console.log('queryPublicDataConstruct: sparql:', sparql)\n if (!queryTarget.endpoint) {\n throw new Error('Query target endpoint is required')\n }\n const myUrlWithParams = new URL(queryTarget.endpoint)\n myUrlWithParams.searchParams.append('query', sparql)\n const queryURI = myUrlWithParams.href\n console.log(' queryPublicDataConstruct uri: ' + queryURI)\n const options = {\n credentials: 'omit' as const, // CORS\n headers: { Accept: 'text/turtle' }\n }\n const response = await store.fetcher.webOperation('GET', queryURI, options)\n const text = response.responseText\n const report = text && text.length > 500 ? text.slice(0, 200) + ' ... ' + text.slice(-200) : text\n console.log(' queryPublicDataConstruct result text:' + report)\n if (!text || text.length === 0) { throw new Error('queryPublicDataConstruct: No text back from construct query:' + queryURI) } else { parse(text, store, publicId.uri, 'text/turtle') }\n}\n\nexport async function loadPublicDataThing (kb, subject: NamedNode, publicDataID: NamedNode) {\n if (publicDataID.uri.startsWith('https://dbpedia.org/resource/')) {\n return getDbpediaDetails(kb, subject, publicDataID)\n } else if (publicDataID.uri.match(/^https?:\\/\\/www\\.wikidata\\.org\\/entity\\/.*/)) {\n // Previous approach:\n // const QId = publicDataID.uri.split('/')[4]\n // const dataURI = `http://www.wikidata.org/wiki/Special:EntityData/${QId}.ttl`\n // Not used because loading the data URI gives much too much irrelevant data from Wikidata.\n await getWikidataDetails(kb, subject, publicDataID)\n // await getWikidataLocation(kb, subject, publicDataID) -- should get that in the details query now\n } else {\n const iDToFetch = publicDataID.uri.startsWith('http:')\n ? kb.sym('https:' + publicDataID.uri.slice(5))\n : publicDataID\n return kb.fetcher.load(iDToFetch, {\n credentials: 'omit',\n headers: { Accept: 'text/turtle' }\n })\n }\n}\n\nexport async function getWikidataDetails (kb, solidSubject:NamedNode, publicDataID:NamedNode) {\n const subjRegexp = /wd:Q49108/g\n const sparql = instituteDetailsQuery.replace(subjRegexp, publicDataID.value)\n await queryPublicDataConstruct(sparql, publicDataID, wikidataParameters)\n console.log('getWikidataDetails: loaded.', publicDataID)\n}\n\nexport async function getWikidataDetailsOld (kb, solidSubject:NamedNode, publicDataID:NamedNode) {\n const sparql = `select distinct * where {\n optional { $(subject) wdt:P31 ?class } # instance of\n optional { $(subject) wdt:P154 ?logo }\n optional { $(subject) wdt:P158 ?sealImage }\n# optional { $(subject) wdt:P159 ?headquartersLocation }\n\noptional { $(subject) wdt:P17 ?country }\noptional { $(subject) wdt:P18 ?image }\noptional { $(subject) wdt:P1813 ?shortName }\n\noptional { $(subject) wdt:P355 ?subsidiary }\n# SERVICE wikibase:label { bd:serviceParam wikibase:language \"fr,en,de,it\" }\n}`\n .replace(subjectRegexp, publicDataID.uri)\n const bindings = await queryPublicDataSelect(sparql, wikidataParameters)\n loadFromBindings(kb, publicDataID, bindings, publicDataID.doc()) // arg2 was solidSubject\n}\n\nexport async function getWikidataLocation (kb, solidSubject:NamedNode, publicDataID:NamedNode) {\n const sparql = `select distinct * where {\n\n $(subject) wdt:P276 ?location .\n\n optional { ?location wdt:P2044 ?elevation }\n optional { ?location wdt:P131 ?region }\n optional { ?location wdt:P625 ?coordinates }\noptional { ?location wdt:P17 ?country }\n\n# SERVICE wikibase:label { bd:serviceParam wikibase:language \"fr,en,de,it\" }\n}`.replace(subjectRegexp, publicDataID.uri)\n console.log(' location query sparql:' + sparql)\n const bindings = await queryPublicDataSelect(sparql, wikidataParameters)\n console.log(' location query bindings:', bindings)\n loadFromBindings(kb, publicDataID, bindings, publicDataID.doc()) // was solidSubject\n}\n\nexport async function getDbpediaDetails (kb, solidSubject:NamedNode, publicDataID:NamedNode) {\n// Note below the string form of the named node with <> works in SPARQL\n const sparql = `select distinct ?city, ?state, ?country, ?homepage, ?logo, ?lat, ?long, WHERE {\n OPTIONAL { <${publicDataID}> <http://dbpedia.org/ontology/city> ?city }\n OPTIONAL { ${publicDataID} <http://dbpedia.org/ontology/state> ?state }\n OPTIONAL { ${publicDataID} <http://dbpedia.org/ontology/country> ?country }\n OPTIONAL { ${publicDataID} foaf:homepage ?homepage }\n OPTIONAL { ${publicDataID} foaf:lat ?lat; foaf:long ?long }\n OPTIONAL { ${publicDataID} <http://dbpedia.org/ontology/country> ?country }\n }`\n /*\n const predMap = {\n city: ns.vcard('locality'),\n state: ns.vcard('region'),\n country: ns.vcard('country-name'),\n homepage: ns.foaf('homepage'),\n lat: ns.geo('latitude'),\n long: ns.geo('longitude'),\n }\n */\n const bindings = await queryPublicDataSelect(sparql, dbpediaParameters)\n return bindings.map(binding => {\n const uri = binding.subject.value // @@ To be written\n const name = binding.name?.value\n return { uri, name }\n })\n}\n"],"mappings":"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","ignoreList":[]}
|