data-pipeline-information-system-sparql
Version:
Sparql function to query/update RDF through SPARQL 1.1
55 lines (49 loc) • 2.12 kB
text/typescript
import sparqljs from 'sparqljs';
import DefinitionPattern from './DefinitionPattern';
let prefixes: {[key: string] : string} = {}
export function generateBody(definition: DefinitionPattern) {
prefixes = {};
// let out_query = JSON.parse(JSON.stringify(definition.query)) ;
let out_query = _generateBody(definition);
let generator = new sparqljs.Generator(prefixes);
console.log(out_query)
return generator.stringify(out_query)
// Object.keys(definition.subQuery).forEach((refAttribute) => {
// let subDefinition = definition.subQuery[refAttribute];
// _generateBody(subDefinition);
// })
}
function _generateBody(definition: DefinitionPattern) {
let coreQuery = definition.query;
prefixes = {...prefixes, ...definition.query.prefixes}
definition.query.prefixes = {}
Object.keys(definition.subQuery).forEach((refAttribute) => {
let subDefinition = definition.subQuery[refAttribute];
let subQuery = subDefinition.query;
let parser = new sparqljs.Parser();
let _res = parser.parse(`
SELECT (?${subDefinition.primaryKey} AS ?${refAttribute}_pKey) WHERE {
?uri a ?thing
}`);
// // console.log((<unknown & {variables: any[]}>_res).variables[0]);
// // (<sparqljs.SelectQuery>_res).variables[0];
// // <unknown>(subQuery.variables).push((<unknown>{
// // expression: '?uri',
// // variable: '?NALTnode'
// // }));
<unknown>(subQuery.variables).push((<unknown & {variables: any[]}>_res).variables[0]);
(<sparqljs.VariableExpression>subQuery.variables[0]).variable = <sparqljs.Term>('?' + refAttribute);
_generateBody(subDefinition);
let addGroup = {
type: 'group',
patterns:
[
subQuery
]
};
(<sparqljs.Pattern[]>coreQuery.where).push(<sparqljs.Pattern>addGroup);
// (<sparqljs.Pattern[]>coreQuery.where).push(<sparqljs.Pattern>subQuery)
})
return <sparqljs.SelectQuery>coreQuery;
}
export default generateBody;