Skip to content

Commit

Permalink
Added support to filter by property
Browse files Browse the repository at this point in the history
  • Loading branch information
sahalali committed Jul 15, 2024
1 parent 70ec6bf commit e70c4de
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 13 deletions.
4 changes: 3 additions & 1 deletion src/constant/recon-queries.constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,12 @@ WHERE
{
values ?query { "QUERY_PLACE_HOLDER" }
TYPE_PLACE_HOLDER
?search a luc-index:INDEX_PLACE_HOLDER ;
luc:query ?query ;
luc:entities ?entity .
PROPERTY_PLACE_HOLDER
FILTER (CONTAINS(STR(?entity),"kg.artsdata.ca/resource/"))
?entity luc:score ?score;
Expand Down
7 changes: 6 additions & 1 deletion src/dto/recon.dto.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { ApiProperty } from "@nestjs/swagger";
import { MatchQualifierEnum, MatchQuantifierEnum } from "../enum";

class ReconciliationType {
@ApiProperty()
Expand Down Expand Up @@ -45,11 +46,15 @@ export class ReconciliationResponse {
}


class QueryCondition {
export class QueryCondition {
@ApiProperty()
matchType: string;
@ApiProperty()
v: string;
@ApiProperty()
pid?: string;
@ApiProperty()
required?: boolean;
}

class ReconciliationQuery {
Expand Down
11 changes: 11 additions & 0 deletions src/enum/reconciliation-types.enum.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,15 @@ export enum LanguageTagEnum {
export enum ReconRequestMatchTypeEnum {
NAME = "name",
PROPERTY = "property"
}

export enum MatchQuantifierEnum {
// ANY = "any",
ALL = "all",
NONE = "none"
}

export enum MatchQualifierEnum {
WILDCARD_MATCH = "WildcardMatch",

}
33 changes: 26 additions & 7 deletions src/service/artsdata/artsdata.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { ARTSDATA } from "../../config";
import { QUERIES } from "../../constant/recon-queries.constants";
import { HttpService } from "../http";
import { ReconciliationServiceHelper } from "../../helper/reconciliation-service.helper";
import { QueryCondition } from "../../dto";

@Injectable()
export class ArtsdataService {
Expand All @@ -16,12 +17,22 @@ export class ArtsdataService {
return sparqlEndpoint.toString();
}

async getReconciliationResult(name: string, type: string, limit?: number) {
async getReconciliationResult(name: string, propertyConditions: QueryCondition[], type: string, limit?: number) {
if (name === undefined || name === null || name === "") {
return [];
}
const graphdbIndex: string = ReconciliationServiceHelper.getGraphdbIndex(type);

const rawSparqlQuery: string = this._getSparqlQuery(name, type, limit);
const rawSparqlQueryWithPropertyFilters = this._resolvePropertyConditions(rawSparqlQuery, propertyConditions);
const sparqlQuery: string = "query=" + encodeURIComponent(rawSparqlQueryWithPropertyFilters);
const sparqlEndpoint: string = this._getArtsdataEndPoint();
const response = await this.httpService.postRequest(sparqlEndpoint, sparqlQuery);
return ReconciliationServiceHelper.formatReconciliationResponse(name, response);
}


private _getSparqlQuery(name: string, type: string, limit: number | undefined): string {
const graphdbIndex: string = ReconciliationServiceHelper.getGraphdbIndex(type);
let rawSparqlQuery: string = QUERIES.RECONCILITAION_QUERY
.replace("INDEX_PLACE_HOLDER", graphdbIndex)
.replace("QUERY_PLACE_HOLDER", name);
Expand All @@ -33,14 +44,22 @@ export class ArtsdataService {
}
rawSparqlQuery = rawSparqlQuery.replace("TYPE_PLACE_HOLDER", typePlaceholderReplace);


if (limit && limit > 0) {
rawSparqlQuery = rawSparqlQuery + " LIMIT " + limit;
}
const sparqlQuery = "query=" + encodeURIComponent(rawSparqlQuery);
const response = await this.httpService.postRequest(sparqlEndpoint, sparqlQuery);
return ReconciliationServiceHelper.formatReconciliationResponse(name, response);
return rawSparqlQuery;
}


private _resolvePropertyConditions(rawSparqlQuery: string, propertyConditions: QueryCondition[]) {
const propertyTriples: string = "";
propertyConditions.forEach((condition) => {
if (condition.required) {
propertyTriples.concat(`?entity schema:${condition.pid} ${condition.v} .`);
} else {
propertyTriples.concat(`OPTIONAL {?entity schema:${condition.pid} ${condition.v} .}`);
}
});
rawSparqlQuery = rawSparqlQuery.replace("PROPERTY_PLACE_HOLDER", propertyTriples);
return rawSparqlQuery;
}
}
15 changes: 11 additions & 4 deletions src/service/recon/recon.service.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Injectable } from "@nestjs/common";
import { ArtsdataService } from "../artsdata";
import { ManifestService } from "../manifest";
import { ReconciliationRequest, ReconciliationResponse, ReconciliationResults } from "../../dto";
import { QueryCondition, ReconciliationRequest, ReconciliationResponse, ReconciliationResults } from "../../dto";
import { Exception } from "../../helper";
import { ReconRequestMatchTypeEnum } from "../../enum";

Expand Down Expand Up @@ -35,12 +35,19 @@ export class ReconciliationService {
}
for (const reconciliationQuery of queries) {
const { type, limit, conditions } = reconciliationQuery;
const query = conditions
.find(condition => condition.matchType == ReconRequestMatchTypeEnum.NAME)?.v;
const candidates = await this._artsdataService.getReconciliationResult(query as string, type, limit);

const { name, propertyConditions } = this._resolveConditions(conditions);
const candidates = await this._artsdataService.getReconciliationResult(name as string, propertyConditions, type, limit);
results.push({ candidates: candidates });
}
return { results };
}

private _resolveConditions(conditions: QueryCondition[]) {
const name = conditions
.find(condition => condition.matchType == ReconRequestMatchTypeEnum.NAME)?.v;
const propertyConditions = conditions
.filter(condition => condition.matchType == ReconRequestMatchTypeEnum.PROPERTY);
return { name, propertyConditions };
}
}

0 comments on commit e70c4de

Please sign in to comment.