From 3ce067badf39f6b46d1ff003f54543caf4f3ef61 Mon Sep 17 00:00:00 2001 From: henrietteharmse Date: Thu, 20 Jul 2023 17:00:44 +0100 Subject: [PATCH] Fix #424 --- .../controller/api/v1/V1SearchController.java | 7 +- .../transforms/LocalizationTransform.java | 4 +- dataload/configs/ado.json | 50 +++++++++ .../orcid2level/dependency-reduced-pom.xml | 2 +- .../annotators/DefinitionAnnotator.java | 24 ++++- .../rdf2json/annotators/LabelAnnotator.java | 59 ++++++++++- .../rdf2json/annotators/SynonymAnnotator.java | 23 +++- .../annotators/helpers/PropertyCollator.java | 42 +------- testcases/localized-labels/label.json | 9 ++ testcases/localized-labels/label.rdf | 100 ++++++++++++++++++ 10 files changed, 273 insertions(+), 47 deletions(-) create mode 100644 dataload/configs/ado.json create mode 100644 testcases/localized-labels/label.json create mode 100644 testcases/localized-labels/label.rdf diff --git a/backend/src/main/java/uk/ac/ebi/spot/ols/controller/api/v1/V1SearchController.java b/backend/src/main/java/uk/ac/ebi/spot/ols/controller/api/v1/V1SearchController.java index 620111592..0f10d61c9 100644 --- a/backend/src/main/java/uk/ac/ebi/spot/ols/controller/api/v1/V1SearchController.java +++ b/backend/src/main/java/uk/ac/ebi/spot/ols/controller/api/v1/V1SearchController.java @@ -216,7 +216,12 @@ public void search( if (fieldList.contains("id")) outDoc.put("id", JsonHelper.getString(json, "id")); if (fieldList.contains("iri")) outDoc.put("iri", JsonHelper.getString(json, "iri")); if (fieldList.contains("ontology_name")) outDoc.put("ontology_name", JsonHelper.getString(json, "ontologyId")); - if (fieldList.contains("label")) outDoc.put("label", JsonHelper.getStrings(json, "label")); + if (fieldList.contains("label")) { + var label = outDoc.put("label", JsonHelper.getStrings(json, "label")); + if(label!=null) { + outDoc.put("label", label); + } + } if (fieldList.contains("description")) outDoc.put("description", JsonHelper.getStrings(json, "definition")); if (fieldList.contains("short_form")) outDoc.put("short_form", JsonHelper.getStrings(json, "shortForm")); if (fieldList.contains("obo_id")) outDoc.put("obo_id", JsonHelper.getStrings(json, "curie")); diff --git a/backend/src/main/java/uk/ac/ebi/spot/ols/repository/transforms/LocalizationTransform.java b/backend/src/main/java/uk/ac/ebi/spot/ols/repository/transforms/LocalizationTransform.java index af976883a..627e0dd28 100644 --- a/backend/src/main/java/uk/ac/ebi/spot/ols/repository/transforms/LocalizationTransform.java +++ b/backend/src/main/java/uk/ac/ebi/spot/ols/repository/transforms/LocalizationTransform.java @@ -187,7 +187,9 @@ public static JsonObject localizeLinkedEntities(JsonObject linkedEntities, Strin JsonObject entityProps = linkedEntities.getAsJsonObject(entityIri); JsonObject entityPropsRes = new JsonObject(); for(String k : entityProps.keySet()) { - entityPropsRes.add(k, localizeValueWithFallbacks(entityProps.get(k), lang)); + var val = localizeValueWithFallbacks(entityProps.get(k), lang); + if(val!=null) + entityPropsRes.add(k, val); } res.add(entityIri, entityPropsRes); } diff --git a/dataload/configs/ado.json b/dataload/configs/ado.json new file mode 100644 index 000000000..83caa7f3d --- /dev/null +++ b/dataload/configs/ado.json @@ -0,0 +1,50 @@ +{ + "name": "OBO Foundry", + "title": "The OBO Foundry", + "markdown": "kramdown", + "highlighter": "rouge", + "baseurl": "/", + "imgurl": "/images", + "repo": "https://github.com/OBOFoundry/OBOFoundry.github.io/", + "repo_src": "https://github.com/OBOFoundry/OBOFoundry.github.io/blob/master/", + "author": { + "name": "OBO Technical WG" + }, + "ontologies": [ + { + "activity_status": "active", + "contact": { + "email": "alpha.tom.kodamullil@scai.fraunhofer.de", + "github": "akodamullil", + "label": "Alpha Tom Kodamullil", + "orcid": "0000-0001-9896-3531" + }, + "dependencies": [ + { + "id": "bfo" + } + ], + "description": "Alzheimer's Disease Ontology is a knowledge-based ontology that encompasses varieties of concepts related to Alzheimer'S Disease, structured by upper level Basic Formal Ontology(BFO). This Ontology is enriched by the interrelated entities that demonstrate the network of the understanding on Alzheimer's disease and can be readily applied for text mining.", + "domain": "health", + "homepage": "https://github.com/Fraunhofer-SCAI-Applied-Semantics/ADO", + "id": "ado", + "layout": "ontology_detail", + "license": { + "label": "CC BY 4.0", + "logo": "http://mirrors.creativecommons.org/presskit/buttons/80x15/png/by.png", + "url": "https://creativecommons.org/licenses/by/4.0/" + }, + "ontology_purl": "http://purl.obolibrary.org/obo/ado.owl", + "preferredPrefix": "ADO", + "products": [ + { + "id": "ado.owl", + "ontology_purl": "http://purl.obolibrary.org/obo/ado.owl" + } + ], + "repository": "https://github.com/Fraunhofer-SCAI-Applied-Semantics/ADO", + "title": "Alzheimer's Disease Ontology", + "tracker": "https://github.com/Fraunhofer-SCAI-Applied-Semantics/ADO/issues" + } + ] +} diff --git a/dataload/extras/orcid2level/dependency-reduced-pom.xml b/dataload/extras/orcid2level/dependency-reduced-pom.xml index f24e3d4f0..b8f11dad9 100644 --- a/dataload/extras/orcid2level/dependency-reduced-pom.xml +++ b/dataload/extras/orcid2level/dependency-reduced-pom.xml @@ -2,7 +2,7 @@ 4.0.0 uk.ac.ebi.spot - orcid-extractor + orcid2level 1.0-SNAPSHOT diff --git a/dataload/rdf2json/src/main/java/uk/ac/ebi/rdf2json/annotators/DefinitionAnnotator.java b/dataload/rdf2json/src/main/java/uk/ac/ebi/rdf2json/annotators/DefinitionAnnotator.java index 8dcb1f0cb..a37f3fccc 100644 --- a/dataload/rdf2json/src/main/java/uk/ac/ebi/rdf2json/annotators/DefinitionAnnotator.java +++ b/dataload/rdf2json/src/main/java/uk/ac/ebi/rdf2json/annotators/DefinitionAnnotator.java @@ -3,6 +3,7 @@ import uk.ac.ebi.rdf2json.OntologyGraph; import uk.ac.ebi.rdf2json.OntologyNode; import uk.ac.ebi.rdf2json.annotators.helpers.PropertyCollator; +import uk.ac.ebi.rdf2json.properties.PropertyValue; public class DefinitionAnnotator { @@ -27,6 +28,27 @@ public static Set getDefinitionProperties(OntologyGraph graph) { } public static void annotateDefinitions(OntologyGraph graph) { - PropertyCollator.collateProperties(graph, "definition", getDefinitionProperties(graph), List.of()); + collateProperties(graph, "definition", getDefinitionProperties(graph)); + } + + private static void collateProperties(OntologyGraph graph, String destProp, Collection sourceProps) { + + for(String id : graph.nodes.keySet()) { + OntologyNode c = graph.nodes.get(id); + + // skip bnodes + if(c.uri == null) + continue; + + for(String prop : sourceProps) { + List values = c.properties.getPropertyValues(prop); + if(values != null) { + for(PropertyValue value : values) { + c.properties.addProperty(destProp, value); + } + } + } + } + } } diff --git a/dataload/rdf2json/src/main/java/uk/ac/ebi/rdf2json/annotators/LabelAnnotator.java b/dataload/rdf2json/src/main/java/uk/ac/ebi/rdf2json/annotators/LabelAnnotator.java index cd9ec4526..39f4bc127 100644 --- a/dataload/rdf2json/src/main/java/uk/ac/ebi/rdf2json/annotators/LabelAnnotator.java +++ b/dataload/rdf2json/src/main/java/uk/ac/ebi/rdf2json/annotators/LabelAnnotator.java @@ -3,6 +3,8 @@ import uk.ac.ebi.rdf2json.OntologyGraph; import uk.ac.ebi.rdf2json.OntologyNode; import uk.ac.ebi.rdf2json.annotators.helpers.PropertyCollator; +import uk.ac.ebi.rdf2json.properties.PropertyValue; +import uk.ac.ebi.rdf2json.properties.PropertyValueLiteral; public class LabelAnnotator { @@ -12,7 +14,8 @@ public static Set getLabelProperties(OntologyGraph graph) { List.of( "http://www.w3.org/2000/01/rdf-schema#label", "http://purl.org/dc/elements/1.1/title", - "http://purl.org/dc/terms/title" + "http://purl.org/dc/terms/title", + "http://www.w3.org/2004/02/skos/core#prefLabel" ) ); @@ -26,6 +29,58 @@ public static Set getLabelProperties(OntologyGraph graph) { } public static void annotateLabels(OntologyGraph graph) { - PropertyCollator.collateProperties(graph, "label", getLabelProperties(graph), List.of("shortForm")); + collateProperties(graph, "label", getLabelProperties(graph), List.of("shortForm")); + } + + private static void collateProperties(OntologyGraph graph, String destProp, Collection sourceProps, Collection fallbackProps) { + + long startTime3 = System.nanoTime(); + + for(String id : graph.nodes.keySet()) { + OntologyNode c = graph.nodes.get(id); + + // skip bnodes + if(c.uri == null) + continue; + + boolean hasEnglishValue = false; + + for(String prop : sourceProps) { + List values = c.properties.getPropertyValues(prop); + if(values != null) { + for(PropertyValue value : values) { + c.properties.addProperty(destProp, value); + if(!isNonEnglishValue(graph, value)) + hasEnglishValue = true; + } + } + } + + if(!hasEnglishValue) { + for(String prop : fallbackProps) { + List values = c.properties.getPropertyValues(prop); + if (values != null) { + for (PropertyValue value : values) { + c.properties.addProperty(destProp, value); + } + } + } + } + } + + long endTime3 = System.nanoTime(); + System.out.println("collate properties from " + sourceProps + " and fallback " + fallbackProps + " into " + destProp + ": " + ((endTime3 - startTime3) / 1000 / 1000 / 1000)); + + + } + + private static boolean isNonEnglishValue(OntologyGraph graph, PropertyValue value) { + if(value.getType() == PropertyValue.Type.LITERAL) { + PropertyValueLiteral literal = (PropertyValueLiteral) value; + if( !literal.getLang().equals("") && !literal.getLang().equals("en")) { + return true; + } + } + return false; } } diff --git a/dataload/rdf2json/src/main/java/uk/ac/ebi/rdf2json/annotators/SynonymAnnotator.java b/dataload/rdf2json/src/main/java/uk/ac/ebi/rdf2json/annotators/SynonymAnnotator.java index 74a9ce819..12cf4ce2b 100644 --- a/dataload/rdf2json/src/main/java/uk/ac/ebi/rdf2json/annotators/SynonymAnnotator.java +++ b/dataload/rdf2json/src/main/java/uk/ac/ebi/rdf2json/annotators/SynonymAnnotator.java @@ -30,6 +30,27 @@ public static Set getSynonymProperties(OntologyGraph graph) { } public static void annotateSynonyms(OntologyGraph graph) { - PropertyCollator.collateProperties(graph, "synonym", getSynonymProperties(graph), List.of()); + collateProperties(graph, "synonym", getSynonymProperties(graph)); + } + + private static void collateProperties(OntologyGraph graph, String destProp, Collection sourceProps) { + + for(String id : graph.nodes.keySet()) { + OntologyNode c = graph.nodes.get(id); + + // skip bnodes + if(c.uri == null) + continue; + + for(String prop : sourceProps) { + List values = c.properties.getPropertyValues(prop); + if(values != null) { + for(PropertyValue value : values) { + c.properties.addProperty(destProp, value); + } + } + } + } + } } diff --git a/dataload/rdf2json/src/main/java/uk/ac/ebi/rdf2json/annotators/helpers/PropertyCollator.java b/dataload/rdf2json/src/main/java/uk/ac/ebi/rdf2json/annotators/helpers/PropertyCollator.java index aaca09b85..0eece56df 100644 --- a/dataload/rdf2json/src/main/java/uk/ac/ebi/rdf2json/annotators/helpers/PropertyCollator.java +++ b/dataload/rdf2json/src/main/java/uk/ac/ebi/rdf2json/annotators/helpers/PropertyCollator.java @@ -3,52 +3,14 @@ import uk.ac.ebi.rdf2json.OntologyNode; import uk.ac.ebi.rdf2json.OntologyGraph; import uk.ac.ebi.rdf2json.properties.PropertyValue; +import uk.ac.ebi.rdf2json.properties.PropertyValueBNode; +import uk.ac.ebi.rdf2json.properties.PropertyValueLiteral; import java.util.Collection; import java.util.List; public class PropertyCollator { - public static void collateProperties(OntologyGraph graph, String destProp, Collection sourceProps, Collection fallbackProps) { - - long startTime3 = System.nanoTime(); - - for(String id : graph.nodes.keySet()) { - OntologyNode c = graph.nodes.get(id); - - // skip bnodes - if(c.uri == null) - continue; - - boolean annotated = false; - - for(String prop : sourceProps) { - List values = c.properties.getPropertyValues(prop); - if(values != null) { - for(PropertyValue value : values) { - c.properties.addProperty(destProp, value); - annotated = true; - } - } - } - - if(!annotated) { - for(String prop : fallbackProps) { - List values = c.properties.getPropertyValues(prop); - if (values != null) { - for (PropertyValue value : values) { - c.properties.addProperty(destProp, value); - } - } - } - } - } - - long endTime3 = System.nanoTime(); - System.out.println("collate properties from " + sourceProps + " and fallback " + fallbackProps + " into " + destProp + ": " + ((endTime3 - startTime3) / 1000 / 1000 / 1000)); - - - } } diff --git a/testcases/localized-labels/label.json b/testcases/localized-labels/label.json new file mode 100644 index 000000000..295f42435 --- /dev/null +++ b/testcases/localized-labels/label.json @@ -0,0 +1,9 @@ +{ + "ontologies": [ + { + "id": "label", + "preferredPrefix": "label", + "ontology_purl": "./testcases/localized-labels/label.rdf" + } + ] +} diff --git a/testcases/localized-labels/label.rdf b/testcases/localized-labels/label.rdf new file mode 100644 index 000000000..cc88e6237 --- /dev/null +++ b/testcases/localized-labels/label.rdf @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + de Lang + + + + + + + + en label + + + + + + + + + + + + + + noLangProperty + + + + + + + + + + + + + de lang class + + + + + + + + en label class + + + + + + + + + + + + + + + no lang label class + + + + + + +