diff --git a/project/dalia/curation/suggest/disciplines.py b/project/dalia/curation/suggest/disciplines.py index fa074d9ba7ea7cc07202a4dacaa4bd8d5b607ed9..c4328fb36e86609b847d83409252cf782f87baff 100644 --- a/project/dalia/curation/suggest/disciplines.py +++ b/project/dalia/curation/suggest/disciplines.py @@ -3,14 +3,9 @@ from typing import List, Tuple from rdflib import Literal, OWL, RDF, SKOS, URIRef, Variable from project.dalia.api_models.api_models import CurationSuggestDisciplinesResultItem -from project.dalia.query.utils import query_ontologies_dataset -from project.dalia.query_builder.query_builder import ( - FILTER, - FILTER_EXISTS, - FunctionExpressions, - Operators, - QueryBuilder, -) +from project.dalia.query.utils import filter_by_lang, query_ontologies_dataset +from project.dalia.query_builder.query_builder import FILTER_EXISTS, QueryBuilder + # Note: This algorithm is quite inefficient and results in a lot of SPARQL queries. # Another idea would be to pull all disciplines and their narrower/broader nodes at once, e.g. via @@ -71,12 +66,7 @@ def _prepare_query_to_get_disciplines_metadata(discipline_selection_bgp: Tuple) state=False ), (var_discipline, SKOS.prefLabel, var_label), - FILTER( - Operators.EQ( - FunctionExpressions.LANG(var_label), - Literal("en") - ) - ), + filter_by_lang(var_label), (var_discipline, SKOS.notation, var_notation) ).ORDER_BY( var_notation diff --git a/project/dalia/curation/suggest/languages.py b/project/dalia/curation/suggest/languages.py index 935b62c1b8a78e1e60dcf167c334eeda774e01a9..e910ba95a3a4f47d588412523a3314ae715852e0 100644 --- a/project/dalia/curation/suggest/languages.py +++ b/project/dalia/curation/suggest/languages.py @@ -8,16 +8,8 @@ from project.dalia.api_models.api_models import ( CurationSuggestSearchRequest, LabelValueItem, ) -from project.dalia.query.utils import query_ontologies_dataset -from project.dalia.query_builder.query_builder import ( - Aggregates, - BIND, - FILTER, - FunctionExpressions, - OPTIONAL, - Operators, - QueryBuilder, -) +from project.dalia.query.utils import filter_by_lang, query_ontologies_dataset +from project.dalia.query_builder.query_builder import Aggregates, BIND, FunctionExpressions, OPTIONAL, QueryBuilder from project.dalia.rdf.namespace import Jena_text, SKOS_last_call, lvont @@ -47,12 +39,7 @@ def _where_for_text_search(query: str, var_lang: Variable, var_score: Variable, where = [ (subject_list_for_text_search, Jena_text.query, object_list_for_text_search), - FILTER( - Operators.EQ( - FunctionExpressions.LANG(var_label), - Literal("en") - ) - ), + filter_by_lang(var_label), ] return tuple(where) diff --git a/project/dalia/curation/suggest/learning_resource_types.py b/project/dalia/curation/suggest/learning_resource_types.py index c2258884a0245d0ebd3636d4b642b56855203166..798dc1d7a72aeaa03f656d12b90073a88d543f62 100644 --- a/project/dalia/curation/suggest/learning_resource_types.py +++ b/project/dalia/curation/suggest/learning_resource_types.py @@ -1,10 +1,10 @@ from typing import List -from rdflib import Literal, RDFS, SKOS, Variable +from rdflib import RDFS, SKOS, Variable from project.dalia.api_models.api_models import LabelValueItem -from project.dalia.query.utils import query_ontologies_dataset -from project.dalia.query_builder.query_builder import FILTER, FunctionExpressions, GROUP, Operators, QueryBuilder, UNION +from project.dalia.query.utils import filter_by_lang, query_ontologies_dataset +from project.dalia.query_builder.query_builder import FILTER, GROUP, Operators, QueryBuilder, UNION from project.dalia.rdf.namespace import MoDalia, hcrt @@ -54,12 +54,7 @@ def prepare_query_to_get_learning_resource_types() -> str: ), ).build(), (var_lrt, SKOS.prefLabel, var_label), - FILTER( - Operators.EQ( - FunctionExpressions.LANG(var_label), - Literal("en") - ) - ), + filter_by_lang(var_label), ).ORDER_BY( var_label ).build() diff --git a/project/dalia/curation/suggest/media_types.py b/project/dalia/curation/suggest/media_types.py index 4c8fef6bda92015ccd23255e3d17df299ff0f244..022334b3c255c3dda074eb805b92abc8bfac1c65 100644 --- a/project/dalia/curation/suggest/media_types.py +++ b/project/dalia/curation/suggest/media_types.py @@ -1,10 +1,10 @@ from typing import List -from rdflib import Literal, RDFS, SKOS, Variable +from rdflib import RDFS, SKOS, Variable from project.dalia.api_models.api_models import LabelValueItem -from project.dalia.query.utils import query_ontologies_dataset -from project.dalia.query_builder.query_builder import FILTER, FunctionExpressions, Operators, QueryBuilder +from project.dalia.query.utils import filter_by_lang, query_ontologies_dataset +from project.dalia.query_builder.query_builder import QueryBuilder from project.dalia.rdf.namespace import MoDalia @@ -30,12 +30,7 @@ def prepare_query_to_get_media_types() -> str: ).WHERE( (var_type, RDFS.subClassOf, MoDalia.MediaType), (var_type, SKOS.prefLabel, var_label), - FILTER( - Operators.EQ( - FunctionExpressions.LANG(var_label), - Literal("en") - ) - ), + filter_by_lang(var_label), ).ORDER_BY( var_label ).build() diff --git a/project/dalia/curation/suggest/proficiency_levels.py b/project/dalia/curation/suggest/proficiency_levels.py index 5670acf6e2f9cad17abfd5a8998431ea2c5192dc..453defff5860969bd57a081e74299136f499e190 100644 --- a/project/dalia/curation/suggest/proficiency_levels.py +++ b/project/dalia/curation/suggest/proficiency_levels.py @@ -1,10 +1,10 @@ from typing import List -from rdflib import Literal, RDF, RDFS, Variable +from rdflib import RDF, RDFS, Variable from project.dalia.api_models.api_models import LabelValueItem -from project.dalia.query.utils import query_ontologies_dataset -from project.dalia.query_builder.query_builder import FILTER, FunctionExpressions, Operators, QueryBuilder +from project.dalia.query.utils import filter_by_lang, query_ontologies_dataset +from project.dalia.query_builder.query_builder import QueryBuilder from project.dalia.rdf.namespace import MoDalia @@ -32,12 +32,7 @@ def prepare_query_to_get_proficiency_levels() -> str: (var_level, RDF.type, MoDalia.Proficiency), (var_level, MoDalia.hasOrder, var_level_order), (var_level, RDFS.label, var_label), - FILTER( - Operators.EQ( - FunctionExpressions.LANG(var_label), - Literal("en") - ) - ), + filter_by_lang(var_label), ).ORDER_BY( var_level_order ).build() diff --git a/project/dalia/curation/suggest/relation_types.py b/project/dalia/curation/suggest/relation_types.py index f7185db1822fecf23cdf1ed32e85e1513922a68d..92c45eb8fbba2aa01a6ba627a625063a02a89435 100644 --- a/project/dalia/curation/suggest/relation_types.py +++ b/project/dalia/curation/suggest/relation_types.py @@ -1,10 +1,10 @@ from typing import List -from rdflib import Literal, RDFS, Variable +from rdflib import RDFS, Variable from project.dalia.api_models.api_models import LabelValueItem -from project.dalia.query.utils import query_ontologies_dataset -from project.dalia.query_builder.query_builder import FILTER, FunctionExpressions, Operators, QueryBuilder +from project.dalia.query.utils import filter_by_lang, query_ontologies_dataset +from project.dalia.query_builder.query_builder import QueryBuilder from project.dalia.rdf.namespace import MoDalia @@ -30,12 +30,7 @@ def prepare_query_to_get_relation_types() -> str: ).WHERE( (var_type, RDFS.subPropertyOf, MoDalia.isRelatedTo), (var_type, RDFS.label, var_label), - FILTER( - Operators.EQ( - FunctionExpressions.LANG(var_label), - Literal("en") - ) - ), + filter_by_lang(var_label), ).ORDER_BY( var_label ).build() diff --git a/project/dalia/curation/suggest/target_groups.py b/project/dalia/curation/suggest/target_groups.py index 740ce30fce5fce058725924ff9d705376899433b..332630d3b83eb7f58b6b6f58d707c524a58d2db4 100644 --- a/project/dalia/curation/suggest/target_groups.py +++ b/project/dalia/curation/suggest/target_groups.py @@ -1,10 +1,10 @@ from typing import List -from rdflib import Literal, RDFS, SKOS, Variable +from rdflib import RDFS, SKOS, Variable from project.dalia.api_models.api_models import LabelValueItem -from project.dalia.query.utils import query_ontologies_dataset -from project.dalia.query_builder.query_builder import FILTER, FunctionExpressions, Operators, QueryBuilder +from project.dalia.query.utils import filter_by_lang, query_ontologies_dataset +from project.dalia.query_builder.query_builder import QueryBuilder from project.dalia.rdf.namespace import MoDalia @@ -30,12 +30,7 @@ def prepare_query_to_get_target_groups() -> str: ).WHERE( (var_tg, RDFS.subClassOf, MoDalia.TargetGroup), (var_tg, SKOS.prefLabel, var_label), - FILTER( - Operators.EQ( - FunctionExpressions.LANG(var_label), - Literal("en") - ) - ), + filter_by_lang(var_label), ).ORDER_BY( var_label ).build() diff --git a/project/dalia/query/communities/one_to_one_metadata.py b/project/dalia/query/communities/one_to_one_metadata.py index 0cf04f162e8827870b834200fe2c48c4c250dd14..60acec29040c4e109955cc4e3d90443c9b9d6673 100644 --- a/project/dalia/query/communities/one_to_one_metadata.py +++ b/project/dalia/query/communities/one_to_one_metadata.py @@ -1,18 +1,11 @@ from typing import Dict, Iterable from django.utils.text import slugify -from rdflib import DCTERMS, Literal, RDF, URIRef, Variable +from rdflib import DCTERMS, RDF, URIRef, Variable from project.dalia.api_models.api_models import Community, SocialMedia -from project.dalia.query.utils import query_dalia_dataset -from project.dalia.query_builder.query_builder import ( - FILTER, - FunctionExpressions, - OPTIONAL, - Operators, - QueryBuilder, - VALUES -) +from project.dalia.query.utils import filter_by_lang, query_dalia_dataset +from project.dalia.query_builder.query_builder import OPTIONAL, QueryBuilder, VALUES from project.dalia.rdf.namespace import MoDalia, SCHEMA, wdt @@ -109,12 +102,7 @@ def prepare_query_for_one_to_one_metadata_for_communities(community_uri_refs: It (var_community, RDF.type, MoDalia.Community), OPTIONAL( (var_community, DCTERMS.description, var_description), - FILTER( - Operators.EQ( - FunctionExpressions.LANG(var_description), - Literal("en") - ) - ) + filter_by_lang(var_description), ), OPTIONAL((var_community, DCTERMS.title, _VARIABLES["title"])), OPTIONAL((var_community, wdt.Bluesky_handle, _VARIABLES["bluesky_handle"])), diff --git a/project/dalia/query/items/metadata/disciplines.py b/project/dalia/query/items/metadata/disciplines.py index 2522e3eefd653c2e7b5e095aa3edac227471b90b..8ac21afe0e4fc2ff22139514741f2417283f9cfa 100644 --- a/project/dalia/query/items/metadata/disciplines.py +++ b/project/dalia/query/items/metadata/disciplines.py @@ -1,24 +1,18 @@ from typing import Collection, Dict, List from rdflib import SKOS, URIRef -from rdflib.term import Literal, Node +from rdflib.term import Node from project.dalia.api_models.api_models import LabelValueItem from project.dalia.query.items.metadata.one_to_many_metadata import get_one_to_many_metadata_for_resources from project.dalia.query.labels.label_service import VAR_ITEM, VAR_LABEL, get_labels_for_item_uris from project.dalia.query.labels.utils import remap_to_label_value_item -from project.dalia.query.utils import Dataset -from project.dalia.query_builder.query_builder import FILTER, FunctionExpressions, Operators +from project.dalia.query.utils import Dataset, filter_by_lang from project.dalia.rdf.namespace import fabio _LABEL_GRAPH_PATTERN = ( (VAR_ITEM, SKOS.prefLabel, VAR_LABEL), - FILTER( - Operators.EQ( - FunctionExpressions.LANG(VAR_LABEL), - Literal("en") - ) - ) + filter_by_lang(VAR_LABEL), ) diff --git a/project/dalia/query/items/metadata/languages.py b/project/dalia/query/items/metadata/languages.py index f76359ce81c5d771db6088861d8636ee00083a62..37b175b14ce9ae5f589d04f151c3f197841e7b6e 100644 --- a/project/dalia/query/items/metadata/languages.py +++ b/project/dalia/query/items/metadata/languages.py @@ -1,22 +1,16 @@ from typing import Collection, Dict, List from rdflib import DCTERMS, URIRef -from rdflib.term import Literal, Node +from rdflib.term import Node from project.dalia.query.items.metadata.one_to_many_metadata import get_one_to_many_metadata_for_resources from project.dalia.query.labels.label_service import VAR_ITEM, VAR_LABEL, get_labels_for_item_uris -from project.dalia.query.utils import Dataset -from project.dalia.query_builder.query_builder import FILTER, FunctionExpressions, Operators +from project.dalia.query.utils import Dataset, filter_by_lang from project.dalia.rdf.namespace import SKOS_last_call _LABEL_GRAPH_PATTERN = ( (VAR_ITEM, SKOS_last_call.prefLabel, VAR_LABEL), - FILTER( - Operators.EQ( - FunctionExpressions.LANG(VAR_LABEL), - Literal("en") - ) - ) + filter_by_lang(VAR_LABEL), ) diff --git a/project/dalia/query/items/metadata/learning_resource_types.py b/project/dalia/query/items/metadata/learning_resource_types.py index d9fd07bf1b1b6b0314a422b5dc91821f1a618414..6a3aaa9b032f030bb1ad567504c4d207d0fc88b1 100644 --- a/project/dalia/query/items/metadata/learning_resource_types.py +++ b/project/dalia/query/items/metadata/learning_resource_types.py @@ -1,24 +1,18 @@ from typing import Collection, Dict, List from rdflib import SKOS, URIRef -from rdflib.term import Literal, Node +from rdflib.term import Node from project.dalia.api_models.api_models import LabelValueItem from project.dalia.query.items.metadata.one_to_many_metadata import get_one_to_many_metadata_for_resources from project.dalia.query.labels.label_service import VAR_ITEM, VAR_LABEL, get_labels_for_item_uris from project.dalia.query.labels.utils import remap_to_label_value_item -from project.dalia.query.utils import Dataset -from project.dalia.query_builder.query_builder import FILTER, FunctionExpressions, Operators +from project.dalia.query.utils import Dataset, filter_by_lang from project.dalia.rdf.namespace import MoDalia _LABEL_GRAPH_PATTERN = ( (VAR_ITEM, SKOS.prefLabel, VAR_LABEL), - FILTER( - Operators.EQ( - FunctionExpressions.LANG(VAR_LABEL), - Literal("en") - ) - ) + filter_by_lang(VAR_LABEL), ) diff --git a/project/dalia/query/items/metadata/media_types.py b/project/dalia/query/items/metadata/media_types.py index 898154fd5257bbf7bbe068d1a96d7e4cdc8cfc24..3570481964f44cc2af154eaa265fb7ca75199eab 100644 --- a/project/dalia/query/items/metadata/media_types.py +++ b/project/dalia/query/items/metadata/media_types.py @@ -1,24 +1,18 @@ from typing import Collection, Dict, List from rdflib import SKOS, URIRef -from rdflib.term import Literal, Node +from rdflib.term import Node from project.dalia.api_models.api_models import LabelValueItem from project.dalia.query.items.metadata.one_to_many_metadata import get_one_to_many_metadata_for_resources from project.dalia.query.labels.label_service import VAR_ITEM, VAR_LABEL, get_labels_for_item_uris from project.dalia.query.labels.utils import remap_to_label_value_item -from project.dalia.query.utils import Dataset -from project.dalia.query_builder.query_builder import FILTER, FunctionExpressions, Operators +from project.dalia.query.utils import Dataset, filter_by_lang from project.dalia.rdf.namespace import MoDalia _LABEL_GRAPH_PATTERN = ( (VAR_ITEM, SKOS.prefLabel, VAR_LABEL), - FILTER( - Operators.EQ( - FunctionExpressions.LANG(VAR_LABEL), - Literal("en") - ) - ) + filter_by_lang(VAR_LABEL), ) diff --git a/project/dalia/query/items/metadata/proficiency_levels.py b/project/dalia/query/items/metadata/proficiency_levels.py index 1563913c208e65812dbded50d38630a1b8c5ad94..244320d8a17d456b8fe673e912323b5c511b2c98 100644 --- a/project/dalia/query/items/metadata/proficiency_levels.py +++ b/project/dalia/query/items/metadata/proficiency_levels.py @@ -1,14 +1,13 @@ from typing import Collection, Dict, List from rdflib import RDFS, URIRef -from rdflib.term import Literal, Node, Variable +from rdflib.term import Node, Variable from project.dalia.api_models.api_models import LabelValueItem from project.dalia.query.items.metadata.one_to_many_metadata import get_one_to_many_metadata_for_resources from project.dalia.query.labels.label_service import VAR_ITEM, VAR_LABEL, get_labels_for_item_uris from project.dalia.query.labels.utils import remap_to_label_value_item -from project.dalia.query.utils import Dataset -from project.dalia.query_builder.query_builder import FILTER, FunctionExpressions, Operators +from project.dalia.query.utils import Dataset, filter_by_lang from project.dalia.rdf.namespace import MoDalia _VAR_LEVEL_ORDER = Variable("levelOrder") @@ -16,12 +15,7 @@ _VAR_LEVEL_ORDER = Variable("levelOrder") _LABEL_GRAPH_PATTERN = ( (VAR_ITEM, RDFS.label, VAR_LABEL), (VAR_ITEM, MoDalia.hasOrder, _VAR_LEVEL_ORDER), - FILTER( - Operators.EQ( - FunctionExpressions.LANG(VAR_LABEL), - Literal("en") - ) - ) + filter_by_lang(VAR_LABEL), ) diff --git a/project/dalia/query/items/metadata/target_groups.py b/project/dalia/query/items/metadata/target_groups.py index 8404a89eee0fdfeed76ceaecae9834b18ae365d6..a75a354fe56cc72b191ed7b0be31e0a3485ec954 100644 --- a/project/dalia/query/items/metadata/target_groups.py +++ b/project/dalia/query/items/metadata/target_groups.py @@ -1,24 +1,18 @@ from typing import Collection, Dict, List from rdflib import SKOS, URIRef -from rdflib.term import Literal, Node +from rdflib.term import Node from project.dalia.api_models.api_models import LabelValueItem from project.dalia.query.items.metadata.one_to_many_metadata import get_one_to_many_metadata_for_resources from project.dalia.query.labels.label_service import VAR_ITEM, VAR_LABEL, get_labels_for_item_uris from project.dalia.query.labels.utils import remap_to_label_value_item -from project.dalia.query.utils import Dataset -from project.dalia.query_builder.query_builder import FILTER, FunctionExpressions, Operators +from project.dalia.query.utils import Dataset, filter_by_lang from project.dalia.rdf.namespace import MoDalia _LABEL_GRAPH_PATTERN = ( (VAR_ITEM, SKOS.prefLabel, VAR_LABEL), - FILTER( - Operators.EQ( - FunctionExpressions.LANG(VAR_LABEL), - Literal("en") - ) - ) + filter_by_lang(VAR_LABEL), ) diff --git a/project/dalia/query/utils.py b/project/dalia/query/utils.py index 1c542f0dee2fc216ac483548f791be20e964a587..1808beb128347b7042cb2a71c3ea3f25027982cc 100644 --- a/project/dalia/query/utils.py +++ b/project/dalia/query/utils.py @@ -1,10 +1,12 @@ from enum import Enum from django.conf import settings -from rdflib import URIRef +from rdflib import Literal, Variable from rdflib.plugins.stores.sparqlstore import SPARQLStore from rdflib.query import Result +from project.dalia.query_builder.query_builder import FILTER, FunctionExpressions, Operators + class Dataset(Enum): """ @@ -36,3 +38,12 @@ def _get_triplestore_endpoint_from_settings() -> str: if not endpoint.endswith("/"): endpoint += "/" return endpoint + + +def filter_by_lang(var: Variable, lang: str = "en") -> tuple[FILTER]: + return FILTER( + Operators.EQ( + FunctionExpressions.LANG(var), + Literal(lang) + ) + ) diff --git a/tests/project/dalia/query/labels/test_label_service.py b/tests/project/dalia/query/labels/test_label_service.py index fe2c0ef2662d38de8012f24b724aaf3fabaf84c4..8ef8fb8be983267d45366e45b9257a6e63445dde 100644 --- a/tests/project/dalia/query/labels/test_label_service.py +++ b/tests/project/dalia/query/labels/test_label_service.py @@ -1,6 +1,6 @@ from collections import OrderedDict -from rdflib import Literal, SKOS, URIRef +from rdflib import SKOS, URIRef from project.dalia.query.labels.label_service import ( VAR_ITEM, @@ -8,19 +8,14 @@ from project.dalia.query.labels.label_service import ( get_labels_for_item_uris, prepare_query_for_labels_from_items, ) -from project.dalia.query.utils import Dataset -from project.dalia.query_builder.query_builder import FILTER, FunctionExpressions, Operators +from project.dalia.query.utils import Dataset, filter_by_lang +from project.dalia.query_builder.query_builder import FunctionExpressions from project.dalia.rdf.namespace import SCHEMA from tests.project.dalia.utils import dedent_and_normalize, normalize _LABEL_GRAPH_PATTERN = ( (VAR_ITEM, SKOS.prefLabel, VAR_LABEL), - FILTER( - Operators.EQ( - FunctionExpressions.LANG(VAR_LABEL), - Literal("en") - ) - ) + filter_by_lang(VAR_LABEL), )