Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updated queries to work with Virtuoso as a Backend triplestore. #55

Merged
merged 3 commits into from
Oct 24, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .flaskenv
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,8 @@ LINKEDDATA_API_SETTINGS=development.cfg
LINKEDDATA_API_OIDC_DISCOVERY_URL='https://auth-test.tern.org.au/auth/realms/local/.well-known/openid-configuration'
LINKEDDATA_API_OIDC_CLIENT_ID=dst
LINKEDDATA_API_OIDC_CLIENT_SECRET=
LINKEDDATA_API_OIDC_USE_REFRESH_TOKEN=True
LINKEDDATA_API_OIDC_USE_REFRESH_TOKEN=True

LINKEDDATA_API_ELASTICSEARCH_URL=https://es-test.tern.org.au
LINKEDDATA_API_ELASTICSEARCH_VERIFY_CERTS=
LINKEDDATA_API_ELASTICSEARCH_SSL_SHOW_WARN=
3 changes: 2 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
git+https://bitbucket.org/terndatateam/flask_tern.git@master
rdflib>=6.1.1,<7.0.0
rdflib>=6.1.1,<7.0.0
pydantic==1.10.13
2 changes: 1 addition & 1 deletion src/linkeddata_api/domain/internal_resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def _get_from_list_query(uris: list[str]) -> str:
}
"""
)
return template.render(uris=uris)
return template.render(uris=uris if uris else ["https://empty"])


def get_from_list(
Expand Down
16 changes: 7 additions & 9 deletions src/linkeddata_api/domain/label.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,14 +78,8 @@ def get(
def _get_from_list_query(uris: list[str]) -> str:
# TODO: Currently, we try and fetch from TERN's controlled vocabularies.
# We may want to also fetch with a SERVICE query from other repositories in the future.
tern_cv_uris = [
uri for uri in uris if uri.startswith("http://linked.data.gov.au/def/tern-cv/")
]
uris = [
uri
for uri in uris
if not uri.startswith("http://linked.data.gov.au/def/tern-cv/")
]
tern_cv_uris = [uri for uri in uris if uri.startswith("http://linked.data.gov.au/def/tern-cv/")]
uris = [uri for uri in uris if not uri.startswith("http://linked.data.gov.au/def/tern-cv/")]

template = Template(
"""
Expand Down Expand Up @@ -146,7 +140,11 @@ def _get_from_list_query(uris: list[str]) -> str:
}
"""
)
query = template.render(uris=uris, tern_cv_uris=tern_cv_uris)
# Virtuoso does not allow empty list in VALUES clase, so we fake a useless uri
query = template.render(
uris=uris if uris else ["https://empty"],
tern_cv_uris=tern_cv_uris if tern_cv_uris else ["https://empty"],
)
return query


Expand Down
6 changes: 3 additions & 3 deletions src/linkeddata_api/domain/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,9 @@ class Resource(BaseModel):
class EntrypointItem(BaseModel):
id: str
label: str
description: str = None
created: str = None
modified: str = None
description: str | None = None
created: str | None = None
modified: str | None = None


class EntrypointItems(BaseModel):
Expand Down
34 changes: 12 additions & 22 deletions src/linkeddata_api/domain/viewer/resource/json/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,7 @@ def _get_uris_from_rdf_list(uri: str, rows: list, sparql_endpoint: str) -> list[
def _get_uri_values_and_list_items(
result: dict, sparql_endpoint: str, uri: Optional[str] = None
) -> tuple[list[str], list[str]]:
uri_values = filter(
lambda x: x["o"]["type"] == "uri", result["results"]["bindings"]
)
uri_values = filter(lambda x: x["o"]["type"] == "uri", result["results"]["bindings"])

uri_values = [value["o"]["value"] for value in uri_values]

Expand All @@ -57,9 +55,7 @@ def _get_uri_values_and_list_items(
# Replace value of blank node list head with items.
list_items = []
if uri is not None:
list_items = _get_uris_from_rdf_list(
uri, result["results"]["bindings"], sparql_endpoint
)
list_items = _get_uris_from_rdf_list(uri, result["results"]["bindings"], sparql_endpoint)

for row in list_items:
uri_values.append(row["o"]["value"])
Expand Down Expand Up @@ -102,17 +98,19 @@ def get_uri_label_index(
result: dict, sparql_endpoint: str, uri: Optional[str] = None
) -> dict[str, str]:
uri_values, _ = _get_uri_values_and_list_items(result, sparql_endpoint, uri)
uri_label_index = domain.label.get_from_list(uri_values, sparql_endpoint)
uri_label_index = {}
if uri_values:
uri_label_index = domain.label.get_from_list(uri_values, sparql_endpoint)
return uri_label_index


def get_uri_internal_index(
result: dict, sparql_endpoint: str, uri: Optional[str] = None
) -> dict[str, str]:
uri_values, _ = _get_uri_values_and_list_items(result, sparql_endpoint, uri)
uri_internal_index = domain.internal_resource.get_from_list(
uri_values, sparql_endpoint
)
uri_internal_index = {}
if uri_values:
uri_internal_index = domain.internal_resource.get_from_list(uri_values, sparql_endpoint)
return uri_internal_index


Expand Down Expand Up @@ -226,11 +224,8 @@ def _get_incoming_properties(uri: str, sparql_endpoint: str):
def get_types_and_properties(
result: dict, sparql_endpoint: str, uri: Optional[str] = None
) -> tuple[list[domain.schema.URI], list[domain.schema.PredicateObjects]]:

types: list[domain.schema.URI] = []
properties: dict[
str, set[Union[domain.schema.URI, domain.schema.Literal]]
] = defaultdict(set)
properties: dict[str, set[Union[domain.schema.URI, domain.schema.Literal]]] = defaultdict(set)

# An index of URIs with label values.
uri_label_index = get_uri_label_index(result, sparql_endpoint, uri)
Expand Down Expand Up @@ -271,9 +266,7 @@ def get_types_and_properties(
# object_label = uri_label_index.get(
# row["o"]["value"]
# ) or domain.curie.get(row["o"]["value"])
object_label = (
uri_label_index.get(row["o"]["value"]) or row["o"]["value"]
)
object_label = uri_label_index.get(row["o"]["value"]) or row["o"]["value"]
item = domain.schema.URI(
label=object_label,
value=row["o"]["value"],
Expand Down Expand Up @@ -311,17 +304,14 @@ def get_types_and_properties(
# TODO: Handle blank nodes.
pass
else:
raise ValueError(
f"Expected type to be uri or literal but got {row['o']['type']}"
)
raise ValueError(f"Expected type to be uri or literal but got {row['o']['type']}")

# Use dict and set for performance
properties[predicate].add(item)

# Convert to a list of PredicateObjects
predicate_objects = [
domain.schema.PredicateObjects(predicate=k, objects=v)
for k, v in properties.items()
domain.schema.PredicateObjects(predicate=k, objects=v) for k, v in properties.items()
]

# Duplicates may occur due to processing RDF lists.
Expand Down
Loading