Skip to content
Snippets Groups Projects
Commit 58662a74 authored by Esko Ikkala's avatar Esko Ikkala
Browse files

Get manuscript creation places with a seperate query, organize js files

parent 510b6160
No related branches found
No related tags found
No related merge requests found
import SparqlApi from './SparqlApi';
import datasetConfig from './Datasets';
import {
mapAllResults,
mergeAllResults
} from './Mappers';
import { makeObjectList } from './SparqlObjectMapper';
class SparqlSearchEngine {
doSearch(sparqlQuery, sparqlApi, mapper) {
return sparqlApi.selectQuery(sparqlQuery)
.then((data) => {
if (data.results.bindings.length === 0) {
return [];
}
// console.log(data.results.bindings)
return mapper ? mapper(data.results.bindings) : data.results.bindings;
});
}
getAllManuscripts(datasetId) {
const { endpoint, getAllQuery } = datasetConfig[datasetId];
const sparqlApi = new SparqlApi({ endpoint });
//console.log(getAllQuery)
return this.doSearch(getAllQuery, sparqlApi, makeObjectList);
}
getFederatedManuscripts(datasets) {
return Promise.all(datasets.map((datasetId) =>
this.getAllManuscripts(datasetId))).then(mergeAllResults);
}
}
export default new SparqlSearchEngine();
......@@ -2,7 +2,7 @@ import express from 'express';
import bodyParser from 'body-parser';
import request from 'superagent';
import _ from 'lodash';
import sparqlSearchEngine from './SparqlSearchEngine';
import sparqlSearchEngine from './sparql/SparqlSearchEngine';
const DEFAULT_PORT = 3001;
const app = express();
//const isDevelopment = app.get('env') !== 'production';
......
......@@ -6,7 +6,7 @@ module.exports = {
'timePeriod': '',
//'endpoint': 'http://ldf.fi/mmm-sdbm-cidoc/sparql',
'endpoint': 'http://localhost:3034/ds/sparql',
'getAllQuery': `
'allQuery': `
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
......@@ -20,12 +20,12 @@ module.exports = {
PREFIX sdbm: <https://sdbm.library.upenn.edu/>
SELECT
?id ?sdbm_id
(GROUP_CONCAT(DISTINCT ?label_id; SEPARATOR=", ") AS ?label)
(GROUP_CONCAT(DISTINCT ?author_id; SEPARATOR=", ") AS ?author)
(GROUP_CONCAT(DISTINCT ?timespan_id; SEPARATOR=", ") AS ?timespan)
(GROUP_CONCAT(DISTINCT ?creation_place_id; SEPARATOR=", ") AS ?creationPlace)
(GROUP_CONCAT(DISTINCT ?material_id; SEPARATOR=", ") AS ?material)
(GROUP_CONCAT(DISTINCT ?language_id; SEPARATOR=", ") AS ?language)
(GROUP_CONCAT(DISTINCT ?label_id; SEPARATOR=",") AS ?label)
(GROUP_CONCAT(DISTINCT ?author_id; SEPARATOR=",") AS ?author)
(GROUP_CONCAT(DISTINCT ?timespan_id; SEPARATOR=",") AS ?timespan)
(GROUP_CONCAT(DISTINCT ?creation_place_id; SEPARATOR=",") AS ?creationPlace)
(GROUP_CONCAT(DISTINCT ?material_id; SEPARATOR=",") AS ?material)
(GROUP_CONCAT(DISTINCT ?language_id; SEPARATOR=",") AS ?language)
WHERE {
?id a frbroo:F4_Manifestation_Singleton .
?id rdfs:label ?label_id .
......@@ -42,6 +42,21 @@ module.exports = {
}
GROUP BY ?id ?sdbm_id
`,
'placeQuery': `
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX wgs84: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT DISTINCT ?id ?label ?lat ?long ?source
WHERE {
VALUES ?id { <ID> }
?id skos:prefLabel ?label .
OPTIONAL {
?id wgs84:lat ?lat ;
wgs84:long ?long .
}
OPTIONAL { ?id dc:source ?source . }
}
`,
'tgn': {
// Getty LOD documentation:
// http://vocab.getty.edu/queries#Places_by_Type
......
File moved
File moved
......@@ -23,6 +23,10 @@ export const makeObjectList = (objects) => {
//return self.postProcess(objList);
};
export const makeDict = (objects) => {
return arrayToObject(objects, 'id');
};
/**
* @param {Object} obj A single SPARQL result row object.
* @returns {Object} The mapped object.
......@@ -114,3 +118,15 @@ const merger = (a, b) => {
}
return mergeObjects(a, b);
};
const arrayToObject = (array, keyField) =>
array.reduce((obj, item) => {
let newItem = {};
Object.entries(item).forEach(([key, value]) => {
if (key !== keyField) {
newItem[key] = value.value;
}
});
obj[item[keyField].value] = newItem;
return obj;
}, {});
import _ from 'lodash';
import SparqlApi from './SparqlApi';
import datasetConfig from './Datasets';
import {
//mapAllResults,
mergeAllResults
} from './Mappers';
import { makeObjectList, makeDict } from './SparqlObjectMapper';
class SparqlSearchEngine {
doSearch(sparqlQuery, endpoint, mapper) {
const sparqlApi = new SparqlApi({ endpoint });
return sparqlApi.selectQuery(sparqlQuery)
.then((data) => {
if (data.results.bindings.length === 0) {
return [];
}
// console.log(data.results.bindings)
return mapper ? mapper(data.results.bindings) : data.results.bindings;
});
}
getAllManuscripts(datasetId) {
const { endpoint, allQuery } = datasetConfig[datasetId];
return this.doSearch(allQuery, endpoint, makeObjectList);
}
getFederatedManuscripts(datasets) {
return Promise.all(datasets.map((datasetId) =>
this.getAllManuscripts(datasetId)))
.then(mergeAllResults)
.then((manuscripts) => this.getPlaces(manuscripts));
}
getPlaces(manuscripts) {
const { endpoint, placeQuery } = datasetConfig.mmm;
let placeIds = manuscripts.reduce((places, manuscript) => {
if (manuscript.creationPlace !== undefined) {
const creationPlaceArr = manuscript.creationPlace.split(',');
places = places.concat(creationPlaceArr);
}
return places;
}, []);
placeIds = Array.from(new Set(placeIds)); //remove duplicates
return this.doSearch(placeQuery.replace('<ID>', this.uriFy(placeIds)), endpoint, makeDict)
.then((placeDict) => {
manuscripts.map((manuscript) => {
if (manuscript.creationPlace !== undefined) {
let creationPlaceObjs;
const creationPlaceArr = manuscript.creationPlace.split(',');
if (creationPlaceArr.length > 1) {
creationPlaceObjs = creationPlaceArr.map((place) => {
return placeDict[place];
});
} else {
creationPlaceObjs = placeDict[creationPlaceArr[0]];
}
manuscript.creationPlace = creationPlaceObjs;
return manuscript;
}
});
return manuscripts;
});
}
uriFy(id) {
if (_.isArray(id)) {
return '<' + id.join('> <') + '>';
} else if (id) {
return '<' + id + '>';
}
return;
}
}
export default new SparqlSearchEngine();
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment