UNPKG

@jahed/sparql-engine

Version:

SPARQL query engine for servers and web browsers.

64 lines 2.95 kB
import { isIRI, isVariable } from "../../../utils/rdf.js"; const SES_PREFIX = "https://callidon.github.io/sparql-engine/search#"; export const SES_search = "https://callidon.github.io/sparql-engine/search#search"; export const SES_matchAllTerms = "https://callidon.github.io/sparql-engine/search#matchAllTerms"; export const SES_minRelevance = "https://callidon.github.io/sparql-engine/search#minRelevance"; export const SES_maxRelevance = "https://callidon.github.io/sparql-engine/search#maxRelevance"; export const SES_minRank = "https://callidon.github.io/sparql-engine/search#minRank"; export const SES_maxRank = "https://callidon.github.io/sparql-engine/search#maxRank"; export const SES_relevance = "https://callidon.github.io/sparql-engine/search#relevance"; export const SES_rank = "https://callidon.github.io/sparql-engine/search#rank"; /** * Extract all full text search queries from a BGP, using magic triples to identify them. * A magic triple is an IRI prefixed by 'https://callidon.github.io/sparql-engine/search#' (ses:search, ses:rank, ses:minRank, etc). * @param bgp - BGP to analyze * @return The extraction results */ export function extractFullTextSearchQueries(bgp) { const queries = []; const classicPatterns = []; // find, validate and group all magic triples per query variable const patterns = []; const magicGroups = new Map(); bgp.forEach((triple) => { // A magic triple is an IRI prefixed by 'https://callidon.github.io/sparql-engine/search#' if (isIRI(triple.predicate) && triple.predicate.value.startsWith(SES_PREFIX)) { // assert that the magic triple's subject is a variable if (!isVariable(triple.subject)) { throw new SyntaxError(`Invalid Full Text Search query: the subject of the magic triple ${triple} must a valid URI/IRI.`); } if (!magicGroups.has(triple.subject.value)) { magicGroups.set(triple.subject.value, [triple]); } else { magicGroups.get(triple.subject.value).push(triple); } } else { patterns.push(triple); } }); // find all triple pattern whose object is the subject of some magic triples patterns.forEach((pattern) => { if (magicGroups.has(pattern.subject.value)) { queries.push({ pattern, variable: pattern.subject, magicTriples: magicGroups.get(pattern.subject.value), }); } else if (magicGroups.has(pattern.object.value)) { queries.push({ pattern, variable: pattern.object, magicTriples: magicGroups.get(pattern.object.value), }); } else { classicPatterns.push(pattern); } }); return { queries, classicPatterns }; } //# sourceMappingURL=fts.js.map