UNPKG

sparnatural

Version:

Visual client-side SPARQL query builder and knowledge graph exploration tool

216 lines (181 loc) 6.25 kB
import { Quad, Quad_Object, Quad_Predicate, Quad_Subject, Term } from "@rdfjs/types/data-model"; import { RdfStore } from "rdf-stores"; import { RDF } from "./BaseRDFReader"; import { DataFactory } from "rdf-data-factory"; import { QuadPredicate } from "n3"; let DF = new DataFactory(); export class StoreModel { protected store: RdfStore; constructor(n3store: RdfStore) { this.store = n3store; } public static getLocalName(uri:string):string{ if(uri.includes('#')) return uri.split('#').pop() as string return uri.split('/').pop() as string } /** * Reads the given property on an entity, and return values as an array **/ readProperty(subject: Term, property: Term): Quad_Object[] { return this.store .getQuads(subject, property, null, null) .map(quad => quad.object); } /** * Reads the given property on an entity recursively, and return values as an array **/ readPropertyRec(subject: Term, property: Term): Quad_Object[] { let values:Quad_Object[] = this.store .getQuads(subject, property, null, null) .map(quad => quad.object); let recValues:Quad_Object[] = []; values.forEach(v => { recValues.push(...this.readPropertyRec(v, property)); }); values.push(...recValues); return values; } /** * Reads the given property on an entity, and returns the first value found, or undefined if not found **/ readSingleProperty(subject: Term, property: Term): Term | undefined { var values = this.readProperty(subject, property); if (values.length > 0) { return values[0]; } } /** * Reads the given property on an entity, and returns the first value found cast to Number **/ readSinglePropertyAsNumber(subject: Term, property: Term): number | undefined { var term = this.readSingleProperty(subject, property); if(term) { return Number.parseInt(term.value); } } /** * Finds all subjects having the given property with the given object, or undefined if not found **/ findSubjectsOf(property: Term, object: Term): Quad_Subject[] { return this.store .getQuads(null, property, object, null) .map(quad => quad.subject); } /** * Finds the subjects having the given property with the given object, and returns the first value found, or undefined if not found */ findSingleSubjectOf(property: Term, object: Term): Quad_Subject | undefined { var values = this.findSubjectsOf(property, object); if (values.length > 0) { return values[0]; } } readPropertyInLang( subject: Term, property: Term, lang: string, defaultToNoLang = true ): Term[] { var values = this.store .getQuads(subject, property, null, null) .filter((quad: any) => quad.object.language == lang) .map((quad: Quad) => quad.object); if (values.length == 0 && defaultToNoLang) { values = this.store .getQuads(subject, property, null, null) .filter((quad: any) => quad.object.language == "") .map((quad: Quad) => quad.object); } return values; } /** * Reads the given property on an entity, and returns the first value found, or undefined if not found **/ readSinglePropertyInLang( subject: Term, property: Term, lang: string, defaultToNoLang = true ): Term | undefined { var values = this.readPropertyInLang(subject, property, lang, defaultToNoLang); if (values.length > 0) { return values[0]; } } size():number { return this.store.size } hasProperty(subject: Quad_Subject, property: Quad_Predicate) { return this.hasTriple(subject, property, null); } hasTriple(rdfNode: Quad_Subject, property: Quad_Predicate, value: Quad_Object | null): boolean { return ( this.store.getQuads( rdfNode, property, value, null ).length > 0 ); } findSubjectsWithPredicate(property: Term, rdfNode: Term): Term[] { return this.store .getQuads(null, property, rdfNode, null) .map(quad => quad.subject); } /****** LIST HANDLING ********/ listContains(rdfNode: any, propertyList: any, property: any, value: any) { let found: boolean = false; let listContent: any[] = this.readAsList(rdfNode, propertyList); listContent.forEach(node => { if (this.hasTriple(node, property, value)) found = true; }); return found; } /** * returns RDFTerms */ readAsList(rdfNode: any, property: any):Term[] { let result: Term[] = new Array<Term>(); this.store .getQuads(rdfNode, property, null, null) .map((quad: { object: any }) => { result.push(...this.readListContent(quad.object)) }); return result; } /** * returns RDFTerms */ readListContent(list: Term): Term[] { var result: Term[] = this.store .getQuads(list, RDF.FIRST, null, null) .map((quad: Quad) => quad.object); var subLists = this.readProperty(list, RDF.REST); if (subLists.length > 0) { result = result.concat(this.readListContent(subLists[0])); } return result; } readRootList(listId: any): any { var root = this.readSuperList(listId); if (root == null) { return listId; } else { return this.readRootList(root); } } readSuperList(listId: any) { const propertyQuads = this.store.getQuads( null, RDF.REST, listId, null ); if (propertyQuads.length > 0) { return propertyQuads[0].subject; } else { return null; } } }