Skip to content

Commit 3621643

Browse files
committed
Allow "built-in" controlled terms (such as Species.rattus_norvegicus) to be used as filters in queries
1 parent 54b2de5 commit 3621643

File tree

3 files changed

+37
-3
lines changed

3 files changed

+37
-3
lines changed

fairgraph/queries.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,14 @@ def __init__(self, operation: str, parameter: Optional[str] = None, value: Optio
5050
self.parameter = parameter
5151
self.value = value
5252

53+
def __repr__(self):
54+
repr = f"Filter(operation='{self.operation}'"
55+
if self.parameter:
56+
repr += f", parameter='{self.parameter}'"
57+
if self.value:
58+
repr += f", value='{self.value}'"
59+
return repr + ")"
60+
5361
def serialize(self):
5462
data = {"op": self.operation}
5563
if self.parameter:
@@ -406,7 +414,11 @@ def get_query_filter_property(property, context, filter: Any) -> QueryProperty:
406414
assert all(issubclass(_type, Node) for _type in property.types)
407415
prop = QueryProperty(expanded_path, name=f"Q{property.name}", required=True, reverse=property.reverse)
408416
if filter_obj:
409-
prop.properties.append(QueryProperty("@id", filter=filter_obj))
417+
if filter_obj.value.startswith("https://kg.ebrains.eu/api/instances"):
418+
filter_path = "@id"
419+
else:
420+
filter_path = "http://schema.org/identifier"
421+
prop.properties.append(QueryProperty(filter_path, filter=filter_obj))
410422
else:
411423
for cls in property.types:
412424
child_properties = cls.generate_query_filter_properties(filter)

fairgraph/utility.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -549,10 +549,17 @@ def adapt_structure(structure, replacement):
549549
if "structure" in item:
550550
adapt_structure(item["structure"], replacement)
551551

552+
def adapt_filters(structure, replacement):
553+
for item in structure:
554+
if "filter" in item and "value" in item["filter"]:
555+
item["filter"]["value"] = item["filter"]["value"].replace(*replacement)
556+
if "structure" in item:
557+
adapt_filters(item["structure"], replacement)
558+
552559
migrated_query = deepcopy(query)
553560
migrated_query["meta"]["type"] = adapt_type_4to3(migrated_query["meta"]["type"])
554-
replacement = ("openminds.om-i.org/props", "openminds.ebrains.eu/vocab")
555-
adapt_structure(migrated_query["structure"], replacement)
561+
adapt_structure(migrated_query["structure"], ("openminds.om-i.org/props", "openminds.ebrains.eu/vocab"))
562+
adapt_filters(migrated_query["structure"], ("openminds.om-i.org/instances", "openminds.ebrains.eu/instances"))
556563
return migrated_query
557564

558565

test/test_openminds_core.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,21 @@ def test_retrieve_released_models_filter_species_by_obj(kg_client):
6868
assert rat in study_targets
6969

7070

71+
@skip_if_no_connection
72+
def test_retrieve_released_datasets_filter_species_by_openminds_obj(kg_client):
73+
rat = omterms.Species.by_name("Rattus norvegicus", kg_client)
74+
rat_om = omterms.Species.rattus_norvegicus
75+
assert rat.name == rat_om.name == "Rattus norvegicus"
76+
follow_links = {"study_targets": {}}
77+
datasets = omcore.DatasetVersion.list(kg_client, space="dataset", study_targets=rat, follow_links=follow_links)
78+
datasets_om = omcore.DatasetVersion.list(kg_client, space="dataset", study_targets=rat_om, follow_links=follow_links)
79+
assert len(datasets) > 0
80+
assert len(datasets) == len(datasets_om)
81+
assert [ds.id for ds in datasets] == [ds.id for ds in datasets_om]
82+
for dataset in datasets_om:
83+
assert rat in dataset.study_targets
84+
85+
7186
@skip_if_no_connection
7287
def test_retrieve_released_models_filter_species_by_uuid(kg_client):
7388
human = omterms.Species.by_name("Homo sapiens", kg_client)

0 commit comments

Comments
 (0)