@jahed/sparql-engine
Version:
SPARQL query engine for servers and web browsers.
64 lines • 2.95 kB
JavaScript
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