diff --git a/.gitignore b/.gitignore index b152fdd81..341fb6072 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,4 @@ src/__pycache__/ *.pyc .vscode /site - +src/mirror/ \ No newline at end of file diff --git a/src/Makefile b/src/Makefile index d77a10461..cf4694ba9 100644 --- a/src/Makefile +++ b/src/Makefile @@ -7,7 +7,7 @@ OLD_VERSION = False TODAY ?= $(shell date +%Y-%m-%d) VERSION = $(TODAY) - +CATALOG = --catalog catalog-v001.xml OWL_CLASS_FILES_OLD = $(patsubst %, ../owl/last_official_ASCTB_release/ccf_%_classes.owl, $(JOBS_OLD)) OWL_ANNOTATION_FILES_OLD = $(patsubst %, ../owl/%_annotations.owl, $(JOBS_OLD)) OWL_CLASS_FILES = $(patsubst %, ../owl/ccf_%_classes.owl, $(JOBS)) @@ -40,44 +40,44 @@ validation_reports_release_%: ../logs/%/README.md .PRECIOUS: ../docs/%/graph.md ../owl/ccf_%_classes_t.owl: ../templates/class_template_%.csv ../logs/%/README.md - ${ROBOT} template --add-prefix "CCFH: http://ccf_tools_helpers/class_helper.owl#" \ + $(ROBOT) $(CATALOG) template --add-prefix "CCFH: http://ccf_tools_helpers/class_helper.owl#" \ --add-prefix "dc: http://purl.org/dc/elements/1.1/" \ --add-prefix "skos: http://www.w3.org/2004/02/skos/core#" \ --input helper.owl --template $< \ --output $@ ../owl/ub_%_ASCTB_subset.owl: ../templates/temp_ub_%_ASCTB_subset.csv ../docs/%/graph.md - if [ $(OLD_VERSION) = False ]; then ${ROBOT} template --input helper.owl --template $< --output $@ && \ + if [ $(OLD_VERSION) = False ]; then $(ROBOT) $(CATALOG) template --input helper.owl --template $< --output $@ && \ rm $<; fi ../owl/cl_%_ASCTB_subset.owl: ../templates/temp_cl_%_ASCTB_subset.csv - if [ $(OLD_VERSION) = False ]; then ${ROBOT} template --input helper.owl --template $< --output $@ && \ + if [ $(OLD_VERSION) = False ]; then $(ROBOT) $(CATALOG) template --input helper.owl --template $< --output $@ && \ rm $<; fi ../owl/%_no-valid.owl: ../templates/%_no-valid.csv - if [ $(OLD_VERSION) = False ]; then ${ROBOT} template --input helper.owl --template $< --output $@ && \ + if [ $(OLD_VERSION) = False ]; then $(ROBOT) $(CATALOG) template --input helper.owl --template $< --output $@ && \ rm $<; fi ../owl/%_ASCTB_subset.json: ../owl/ub_%_ASCTB_subset.owl ../owl/cl_%_ASCTB_subset.owl - if [ $(OLD_VERSION) = False ]; then ${ROBOT} merge $(patsubst %, -i %, $^) \ + if [ $(OLD_VERSION) = False ]; then $(ROBOT) merge $(patsubst %, -i %, $^) \ annotate --ontology-iri http://purl.org/ccf/latest/$*_ASCTB_subset.owl \ convert --format json -o $@; fi .PRECIOUS: ../owl/%_ASCTB_subset.json ../owl/%_sec_reduced.owl: ../owl/%_sec.owl - if [ $(OLD_VERSION) = False ]; then ${ROBOT} merge --input helper.owl --input $< reduce --reasoner ELK -o ../owl/$*_sec_reduced.owl && \ + if [ $(OLD_VERSION) = False ]; then $(ROBOT) $(CATALOG) merge --input helper.owl --input $< reduce --reasoner ELK -o ../owl/$*_sec_reduced.owl && \ rm ../owl/$*_sec.owl; fi ../owl/ccf_%_classes.owl: ../owl/ccf_%_classes_t.owl ../owl/%_annotations.owl ../owl/%_no-valid.owl ../owl/%_sec_reduced.owl - if [ $(OLD_VERSION) = False ]; then ${ROBOT} merge --input helper.owl -i ../owl/ccf_$*_classes_t.owl -i ../owl/$*_annotations.owl -o $@ \ + if [ $(OLD_VERSION) = False ]; then $(ROBOT) $(CATALOG) merge --input helper.owl -i ../owl/ccf_$*_classes_t.owl -i ../owl/$*_annotations.owl -o $@ \ merge --input ../owl/$*_sec_reduced.owl -o ../owl/$*_extended.owl \ reduce --reasoner ELK \ merge -i ../owl/ccf_$*_classes_t.owl \ merge --input ../owl/$*_no-valid.owl \ annotate --ontology-iri http://purl.org/ccf/latest/ccf_$*_classes.owl \ convert --format json -o $*.json && \ - ${ROBOT} annotate --input ../owl/$*_sec_reduced.owl --ontology-iri http://purl.org/ccf/latest/$*_sec_reduced.owl convert -o $*_sec_reduced.json && \ + $(ROBOT) annotate --input ../owl/$*_sec_reduced.owl --ontology-iri http://purl.org/ccf/latest/$*_sec_reduced.owl convert -o $*_sec_reduced.json && \ python graph_construct.py $*.json $*_sec_reduced.json $*_f.json "color" "green" && \ og2dot.js -s ../style/ubergraph-style.json $*_f.json > $*.dot && \ dot $*.dot -Tpng -Grankdir=LR > ../graphs/ccf_$*_graph.png && \ @@ -88,7 +88,7 @@ validation_reports_release_%: ../logs/%/README.md rm $*.dot; fi ../owl/last_official_ASCTB_release/ccf_%_classes.owl: ../owl/ccf_%_classes_t.owl ../owl/%_annotations.owl - if [ $(OLD_VERSION) = True ]; then ${ROBOT} merge --input helper.owl -i ../owl/ccf_$*_classes_t.owl -i ../owl/$*_annotations.owl -o $@ \ + if [ $(OLD_VERSION) = True ]; then $(ROBOT) merge --input helper.owl -i ../owl/ccf_$*_classes_t.owl -i ../owl/$*_annotations.owl -o $@ \ annotate --ontology-iri http://purl.org/ccf/latest_official_ASCTB_release/ccf_$*_classes.owl \ convert --format json -o $*.json && \ og2dot.js -s ../style/ubergraph-style.json $*.json > $*.dot &&\ @@ -101,30 +101,30 @@ release_notes: python release_notes_generation.py rm tables_version.txt -../owl/CCF_AS_CT.owl: ${OWL_CLASS_FILES} ${OWL_CLASS_SEC_FILES} release_notes - if [ $(OLD_VERSION) = False ]; then ${ROBOT} merge $(patsubst %, -i %, ${OWL_CLASS_FILES}) \ - merge $(patsubst %, -i %, ${OWL_CLASS_SEC_FILES}) \ +../owl/CCF_AS_CT.owl: $(OWL_CLASS_FILES) $(OWL_CLASS_SEC_FILES) release_notes + if [ $(OLD_VERSION) = False ]; then $(ROBOT) $(CATALOG) merge $(patsubst %, -i %, $(OWL_CLASS_FILES)) \ + merge $(patsubst %, -i %, $(OWL_CLASS_SEC_FILES)) \ reduce --reasoner ELK \ annotate --ontology-iri "http://purl.org/ccf/latest/CCF_AS_CT.owl" \ --version-iri "http://purl.org/ccf/releases/$(VERSION)/CCF_AS_CT.owl" \ --output $@ && \ - rm ${OWL_ANNOTATION_FILES} && \ - rm ${OWL_CLASS_SEC_FILES}; fi + rm $(OWL_ANNOTATION_FILES) && \ + rm $(OWL_CLASS_SEC_FILES); fi -../owl/last_official_ASCTB_release/CCF_AS_CT.owl: ${OWL_CLASS_FILES_OLD} - if [ $(OLD_VERSION) = True ]; then ${ROBOT} merge $(patsubst %, -i %, $^) \ +../owl/last_official_ASCTB_release/CCF_AS_CT.owl: $(OWL_CLASS_FILES_OLD) + if [ $(OLD_VERSION) = True ]; then $(ROBOT) merge $(patsubst %, -i %, $^) \ annotate --ontology-iri "http://purl.org/ccf/latest/CCF_AS_CT.owl" \ --version-iri "http://purl.org/ccf/releases/$(VERSION)/CCF_AS_CT.owl" \ --output $@ && \ - rm ${OWL_ANNOTATION_FILES_OLD}; fi + rm $(OWL_ANNOTATION_FILES_OLD); fi -../owl/UB_ASCTB_subset.owl: ${OWL_UB_SUBSET_FILES} ${JSON_CLASSES_SUBSET} - if [ $(OLD_VERSION) = False ]; then ${ROBOT} merge $(patsubst %, -i %, ${OWL_UB_SUBSET_FILES}) --output $@ && \ - rm ${OWL_UB_SUBSET_FILES}; fi +../owl/UB_ASCTB_subset.owl: $(OWL_UB_SUBSET_FILES) $(JSON_CLASSES_SUBSET) + if [ $(OLD_VERSION) = False ]; then $(ROBOT) $(CATALOG) merge $(patsubst %, -i %, $(OWL_UB_SUBSET_FILES)) --output $@ && \ + rm $(OWL_UB_SUBSET_FILES); fi -../owl/CL_ASCTB_subset.owl: ${OWL_CL_SUBSET_FILES} - if [ $(OLD_VERSION) = False ]; then ${ROBOT} merge $(patsubst %, -i %, $^) --output $@ && \ - rm ${OWL_CL_SUBSET_FILES}; fi +../owl/CL_ASCTB_subset.owl: $(OWL_CL_SUBSET_FILES) + if [ $(OLD_VERSION) = False ]; then $(ROBOT) $(CATALOG) merge $(patsubst %, -i %, $^) --output $@ && \ + rm $(OWL_CL_SUBSET_FILES); fi official_release: make ../owl/CCF_AS_CT.owl ../owl/UB_ASCTB_subset.owl ../owl/CL_ASCTB_subset.owl -B @@ -136,4 +136,22 @@ last_official_release: build-docker-v%: docker buildx use ccf-tools-dep-builder - docker buildx build --platform linux/amd64,linux/arm64 -t anitacaron/ccf-tools-dep:v$* --push ../ \ No newline at end of file + docker buildx build --platform linux/amd64,linux/arm64 -t anitacaron/ccf-tools-dep:v$* --push ../ + + +### Import ODK standard +TODAY ?= $(shell date +%Y-%m-%d) +VERSION= $(TODAY) +ANNOTATE_ONTOLOGY_VERSION = +ANNOTATE_CONVERT_FILE = annotate --ontology-iri http://ccf_tools_helpers/class_helper/ro_import $(ANNOTATE_ONTOLOGY_VERSION) convert -f ofn --output $@.tmp.owl && mv $@.tmp.owl $@ + +mirror/ro.owl: + curl -L http://purl.obolibrary.org/obo/ro.owl --create-dirs -o mirror/ro.owl --retry 4 --max-time 200 && $(ROBOT) convert -i mirror/ro.owl -o $@.tmp.owl && mv $@.tmp.owl $@ +.PRECIOUS: mirror/ro.owl + +imports/ro_import.owl: mirror/ro.owl imports/ro_terms.txt + $(ROBOT) filter --input $< --term-file imports/ro_terms.txt --select "self annotations" \ + annotate --ontology-iri http://ccf_tools_helpers/class_helper/imports/ro_import.owl \ + annotate -V http://ccf_tools_helpers/class_helper/releases/imports/$(VERSION)/ro_import.owl --annotation owl:versionInfo $(VERSION) \ + convert -f ofn --output $@.tmp.owl && mv $@.tmp.owl $@ +.PHONY: imports/ro_import.owl diff --git a/src/catalog-v001.xml b/src/catalog-v001.xml new file mode 100644 index 000000000..b95e4f29b --- /dev/null +++ b/src/catalog-v001.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/helper.owl b/src/helper.owl index 8d41878f5..0e50c1058 100644 --- a/src/helper.owl +++ b/src/helper.owl @@ -7,14 +7,8 @@ Prefix(rdfs:=) Ontology( +Import() -Declaration(ObjectProperty()) -Declaration(ObjectProperty()) -Declaration(ObjectProperty()) -Declaration(ObjectProperty()) -Declaration(ObjectProperty()) -Declaration(ObjectProperty()) -Declaration(ObjectProperty()) Declaration(ObjectProperty()) Declaration(ObjectProperty()) Declaration(AnnotationProperty(:IN_OBO)) @@ -29,36 +23,6 @@ Declaration(Class()) # Object Properties ############################ -# Object Property: (part_of) - -AnnotationAssertion(rdfs:label "part_of") -TransitiveObjectProperty() - -# Object Property: (has_part) - -AnnotationAssertion(rdfs:label "has_part") - -# Object Property: (overlaps) - -AnnotationAssertion(rdfs:label "overlaps") - -# Object Property: (connected_to) - -AnnotationAssertion(rdfs:label "connected_to") -TransitiveObjectProperty() - -# Object Property: (develops_from) - -AnnotationAssertion(rdfs:label "develops_from") - -# Object Property: (located_in) - -AnnotationAssertion(rdfs:label "located_in") - -# Object Property: (continuous_with) - -AnnotationAssertion(rdfs:label "continuous_with") - # Object Property: (https://purl.org/ccf/latest/ccf.owl#ccf_part_of) AnnotationAssertion(rdfs:label "ccf_part_of") diff --git a/src/imports/ro_import.owl b/src/imports/ro_import.owl new file mode 100644 index 000000000..aaaf96a80 --- /dev/null +++ b/src/imports/ro_import.owl @@ -0,0 +1,162 @@ +Prefix(:=) +Prefix(owl:=) +Prefix(rdf:=) +Prefix(xml:=) +Prefix(xsd:=) +Prefix(rdfs:=) + + +Ontology( + +Annotation(owl:versionInfo "2023-07-12"^^xsd:string) + +Declaration(ObjectProperty()) +Declaration(ObjectProperty()) +Declaration(ObjectProperty()) +Declaration(ObjectProperty()) +Declaration(ObjectProperty()) +Declaration(ObjectProperty()) +Declaration(ObjectProperty()) +Declaration(AnnotationProperty()) +Declaration(AnnotationProperty()) +Declaration(AnnotationProperty()) +Declaration(AnnotationProperty()) +Declaration(AnnotationProperty()) +Declaration(AnnotationProperty()) +Declaration(AnnotationProperty()) +Declaration(AnnotationProperty()) +Declaration(AnnotationProperty()) +Declaration(AnnotationProperty()) +Declaration(AnnotationProperty()) +Declaration(AnnotationProperty()) +Declaration(AnnotationProperty()) +Declaration(AnnotationProperty()) + +############################ +# Object Properties +############################ + +# Object Property: (part of) + +AnnotationAssertion( "is part of"@en) +AnnotationAssertion( "my brain is part of my body (continuant parthood, two material entities)"@en) +AnnotationAssertion( "my stomach cavity is part of my stomach (continuant parthood, immaterial entity is part of material entity)"@en) +AnnotationAssertion( "this day is part of this year (occurrent parthood)"@en) +AnnotationAssertion( "a core relation that holds between a part and its whole"@en) +AnnotationAssertion( "Everything is part of itself. Any part of any part of a thing is itself part of that thing. Two distinct things cannot be part of each other."@en) +AnnotationAssertion( "Occurrents are not subject to change and so parthood between occurrents holds for all the times that the part exists. Many continuants are subject to change, so parthood between continuants will only hold at certain times, but this is difficult to specify in OWL. See http://purl.obolibrary.org/obo/ro/docs/temporal-semantics/"@en) +AnnotationAssertion( "Parthood requires the part and the whole to have compatible classes: only an occurrent can be part of an occurrent; only a process can be part of a process; only a continuant can be part of a continuant; only an independent continuant can be part of an independent continuant; only an immaterial entity can be part of an immaterial entity; only a specifically dependent continuant can be part of a specifically dependent continuant; only a generically dependent continuant can be part of a generically dependent continuant. (This list is not exhaustive.) + +A continuant cannot be part of an occurrent: use 'participates in'. An occurrent cannot be part of a continuant: use 'has participant'. A material entity cannot be part of an immaterial entity: use 'has location'. A specifically dependent continuant cannot be part of an independent continuant: use 'inheres in'. An independent continuant cannot be part of a specifically dependent continuant: use 'bearer of'."@en) +AnnotationAssertion( "part_of"@en) +AnnotationAssertion( ) +AnnotationAssertion( ) +AnnotationAssertion( ) +AnnotationAssertion( ) +AnnotationAssertion( ) +AnnotationAssertion( ) +AnnotationAssertion( ) +AnnotationAssertion( ) +AnnotationAssertion( ) +AnnotationAssertion( ) +AnnotationAssertion( ) +AnnotationAssertion( ) +AnnotationAssertion(rdfs:label "part of"@en) +AnnotationAssertion(rdfs:seeAlso ) +AnnotationAssertion(rdfs:seeAlso ) +AnnotationAssertion(rdfs:seeAlso "http://www.obofoundry.org/ro/#OBO_REL:part_of") +AnnotationAssertion(rdfs:seeAlso "https://wiki.geneontology.org/Part_of"^^xsd:anyURI) +SubObjectPropertyOf( ) +InverseObjectProperties( ) +TransitiveObjectProperty() + +# Object Property: (has part) + +AnnotationAssertion( "has part"@en) +AnnotationAssertion( "my body has part my brain (continuant parthood, two material entities)"@en) +AnnotationAssertion( "my stomach has part my stomach cavity (continuant parthood, material entity has part immaterial entity)"@en) +AnnotationAssertion( "this year has part this day (occurrent parthood)"@en) +AnnotationAssertion( "a core relation that holds between a whole and its part"@en) +AnnotationAssertion( "Everything has itself as a part. Any part of any part of a thing is itself part of that thing. Two distinct things cannot have each other as a part."@en) +AnnotationAssertion( "Occurrents are not subject to change and so parthood between occurrents holds for all the times that the part exists. Many continuants are subject to change, so parthood between continuants will only hold at certain times, but this is difficult to specify in OWL. See http://purl.obolibrary.org/obo/ro/docs/temporal-semantics/"@en) +AnnotationAssertion( "Parthood requires the part and the whole to have compatible classes: only an occurrent have an occurrent as part; only a process can have a process as part; only a continuant can have a continuant as part; only an independent continuant can have an independent continuant as part; only a specifically dependent continuant can have a specifically dependent continuant as part; only a generically dependent continuant can have a generically dependent continuant as part. (This list is not exhaustive.) + +A continuant cannot have an occurrent as part: use 'participates in'. An occurrent cannot have a continuant as part: use 'has participant'. An immaterial entity cannot have a material entity as part: use 'location of'. An independent continuant cannot have a specifically dependent continuant as part: use 'bearer of'. A specifically dependent continuant cannot have an independent continuant as part: use 'inheres in'."@en) +AnnotationAssertion( "has_part"@en) +AnnotationAssertion( ) +AnnotationAssertion( ) +AnnotationAssertion( ) +AnnotationAssertion( ) +AnnotationAssertion(rdfs:label "has part"@en) +SubObjectPropertyOf( ) +TransitiveObjectProperty() + +# Object Property: (located in) + +AnnotationAssertion( "located in"@en) +AnnotationAssertion( "my brain is located in my head"@en) +AnnotationAssertion( "this rat is located in this cage"@en) +AnnotationAssertion( "a relation between two independent continuants, the target and the location, in which the target is entirely within the location"@en) +AnnotationAssertion( "Location as a relation between instances: The primitive instance-level relation c located_in r at t reflects the fact that each continuant is at any given time associated with exactly one spatial region, namely its exact location. Following we can use this relation to define a further instance-level location relation - not between a continuant and the region which it exactly occupies, but rather between one continuant and another. c is located in c1, in this sense, whenever the spatial region occupied by c is part_of the spatial region occupied by c1. Note that this relation comprehends both the relation of exact location between one continuant and another which obtains when r and r1 are identical (for example, when a portion of fluid exactly fills a cavity), as well as those sorts of inexact location relations which obtain, for example, between brain and head or between ovum and uterus"@en) +AnnotationAssertion( "Most location relations will only hold at certain times, but this is difficult to specify in OWL. See http://purl.obolibrary.org/obo/ro/docs/temporal-semantics/"@en) +AnnotationAssertion( "located_in"@en) +AnnotationAssertion( ) +AnnotationAssertion( "http://www.obofoundry.org/ro/#OBO_REL:located_in") +AnnotationAssertion( ) +AnnotationAssertion(rdfs:label "located in"@en) +AnnotationAssertion(rdfs:seeAlso "https://wiki.geneontology.org/Located_in"^^xsd:anyURI) +TransitiveObjectProperty() + +# Object Property: (overlaps) + +AnnotationAssertion( ) +AnnotationAssertion( "x overlaps y if and only if there exists some z such that x has part z and z part of y") +AnnotationAssertion( "http://purl.obolibrary.org/obo/BFO_0000051 some (http://purl.obolibrary.org/obo/BFO_0000050 some ?Y)") +AnnotationAssertion( ) +AnnotationAssertion( ) +AnnotationAssertion( ) +AnnotationAssertion( ) +AnnotationAssertion(rdfs:label "overlaps"@en) +SymmetricObjectProperty() + +# Object Property: (continuous with) + +AnnotationAssertion( ) +AnnotationAssertion( "X continuous_with Y if and only if X and Y share a fiat boundary.") +AnnotationAssertion( ) +AnnotationAssertion( "connected to") +AnnotationAssertion( "The label for this relation was previously connected to. I relabeled this to \"continuous with\". The standard notion of connectedness does not imply shared boundaries - e.g. Glasgow connected_to Edinburgh via M8; my patella connected_to my femur (via patellar-femoral joint)") +AnnotationAssertion( ) +AnnotationAssertion(rdfs:label "continuous with"@en) +AnnotationAssertion(rdfs:seeAlso "FMA:85972") +SymmetricObjectProperty() + +# Object Property: (connected to) + +AnnotationAssertion( "a 'toe distal phalanx bone' that is connected to a 'toe medial phalanx bone' (an interphalangeal joint *connects* these two bones).") +AnnotationAssertion( "a is connected to b if and only if a and b are discrete structure, and there exists some connecting structure c, such that c connects a and b") +AnnotationAssertion( ) +AnnotationAssertion(rdfs:label "connected to"@en) +AnnotationAssertion(rdfs:seeAlso "https://github.com/obophenotype/uberon/wiki/Connectivity-Design-Pattern"^^xsd:anyURI) +AnnotationAssertion(rdfs:seeAlso "https://github.com/obophenotype/uberon/wiki/Modeling-articulations-Design-Pattern"^^xsd:anyURI) + +# Object Property: (develops from) + +AnnotationAssertion( ) +AnnotationAssertion( "x develops from y if and only if either (a) x directly develops from y or (b) there exists some z such that x directly develops from z and z develops from y") +AnnotationAssertion( ) +AnnotationAssertion( ) +AnnotationAssertion( ) +AnnotationAssertion( ) +AnnotationAssertion(rdfs:comment "This is the transitive form of the develops from relation") +AnnotationAssertion(rdfs:label "develops from"@en) +TransitiveObjectProperty() + + + +SubObjectPropertyOf(ObjectPropertyChain( ) ) +SubObjectPropertyOf(ObjectPropertyChain( ) ) +SubObjectPropertyOf(ObjectPropertyChain( ) ) +SubObjectPropertyOf(ObjectPropertyChain( ) ) +SubObjectPropertyOf(ObjectPropertyChain( ) ) +) \ No newline at end of file diff --git a/src/imports/ro_terms.txt b/src/imports/ro_terms.txt new file mode 100644 index 000000000..f58bc396d --- /dev/null +++ b/src/imports/ro_terms.txt @@ -0,0 +1,7 @@ +BFO:0000050 +BFO:0000051 +RO:0002131 +RO:0002170 +RO:0002202 +RO:0001025 +RO:0002150 diff --git a/src/template_generation_tools.py b/src/template_generation_tools.py index 3c24c09dc..70b92fa34 100644 --- a/src/template_generation_tools.py +++ b/src/template_generation_tools.py @@ -32,25 +32,25 @@ def generate_class_graph_template(ccf_tools_df :pd.DataFrame, log_dict: dict): 'isa': 'SC %', 'OBO_Validated_isa': '>A CCFH:IN_OBO', 'validation_date_isa': '>A dc:date', - 'part_of': 'SC part_of some %', + 'part_of': "SC 'part of' some %", 'OBO_Validated_part_of': '>A CCFH:IN_OBO', 'validation_date_part_of': '>A dc:date', 'overlaps': 'SC overlaps some %', 'OBO_Validated_overlaps': '>A CCFH:IN_OBO', 'validation_date_overlaps': '>A dc:date', - 'connected_to': 'SC connected_to some %', + 'connected_to': "SC 'connected to' some %", 'OBO_Validated_connected_to': '>A CCFH:IN_OBO', 'validation_date_connected_to': '>A dc:date', - 'develops_from': 'SC develops_from some %', + 'develops_from': "SC 'develops from' some %", 'OBO_Validated_develops_from': '>A CCFH:IN_OBO', 'validation_date_develops_from': '>A dc:date', - 'has_part': 'SC has_part some %', + 'has_part': "SC 'has part' some %", 'OBO_Validated_has_part': '>A CCFH:IN_OBO', 'validation_date_has_part': '>A dc:date', - 'located_in': 'SC located_in some %', + 'located_in': "SC 'located in' some %", 'OBO_Validated_located_in': '>A CCFH:IN_OBO', 'validation_date_located_in': '>A dc:date', - 'continuous_with': 'SC continuous_with some %', + 'continuous_with': "SC 'continuous with' some %", 'OBO_Validated_continuous_with': '>A CCFH:IN_OBO', 'validation_date_continuous_with': '>A dc:date'}