From 0b2ab23b71a4f8fbefc8e4c547e69a988a5b0a92 Mon Sep 17 00:00:00 2001 From: Spencer Bliven Date: Fri, 23 Aug 2024 01:02:11 +0200 Subject: [PATCH] Improve tests - Fix EMDataset-001.yaml so it validates - (Breaking) Replace `type` with `instrument_type` or `molecular_type`. Otherwise it breaks python tests. - (Breaking) Remove multivalued from institution - Fix datetime range Running `rm -r examples/output; make test-examples` still fails --- Makefile | 8 +- README.md | 8 +- project/excel/oscem_schemas.xlsx | Bin 16989 -> 17404 bytes project/graphql/oscem_schemas.graphql | 18 +- project/jsonld/oscem_schemas.context.jsonld | 14 +- project/jsonld/oscem_schemas.jsonld | 72 +- project/jsonschema/oscem_schemas.schema.json | 66 +- project/owl/oscem_schemas.owl.ttl | 1038 +++++++++--------- project/prefixmap/oscem_schemas.yaml | 3 + project/protobuf/oscem_schemas.proto | 14 +- project/shacl/oscem_schemas.shacl.ttl | 783 ++++++------- project/shex/oscem_schemas.shex | 20 +- project/sqlschema/oscem_schemas.sql | 68 +- src/data/examples/EMDataset-001.yaml | 20 +- src/oscem_schemas/datamodel/oscem_schemas.py | 92 +- src/oscem_schemas/schema/acquisition.yaml | 7 +- src/oscem_schemas/schema/organizational.yaml | 3 +- src/oscem_schemas/schema/sample.yaml | 1 - src/oscem_schemas/schema/types.yaml | 6 + 19 files changed, 1173 insertions(+), 1068 deletions(-) diff --git a/Makefile b/Makefile index be57b05..215ba04 100644 --- a/Makefile +++ b/Makefile @@ -133,7 +133,8 @@ ifneq ($(strip ${GEN_TS_ARGS}),) $(RUN) gen-typescript ${GEN_TS_ARGS} $(SOURCE_SCHEMA_PATH) >${DEST}/typescript/${SCHEMA_NAME}.ts endif -test: test-schema test-python test-examples +test: test-validate test-examples test-python +.PHONY: test test-validate test-examples test-python test-schema: $(RUN) gen-project ${CONFIG_YAML} -d tmp $(SOURCE_SCHEMA_PATH) @@ -151,6 +152,9 @@ else $(info Ok) endif +test-validate: + $(RUN) linkml-validate -s $(SOURCE_SCHEMA_PATH) src/data/examples/*.yaml + convert-examples-to-%: $(patsubst %, $(RUN) linkml-convert % -s $(SOURCE_SCHEMA_PATH) -C Person, $(shell ${SHELL} find src/data/examples -name "*.yaml")) @@ -169,7 +173,7 @@ examples/output: src/oscem_schemas/schema/oscem_schemas.yaml --output-formats json \ --output-formats yaml \ --counter-example-input-directory src/data/examples/invalid \ - --input-directory src/data/examples/valid \ + --input-directory src/data/examples \ --output-directory $@ \ --schema $< > $@/README.md diff --git a/README.md b/README.md index 4534458..7319ac5 100644 --- a/README.md +++ b/README.md @@ -32,10 +32,16 @@ Schema for the Open Standards Community for Electron Microscopy (OSC-EM) ## Developer Documentation
-Use the `make` command to generate project artefacts: +Use the `make` command to generate project artifacts: +* `make setup`: one-time setup * `make all`: make everything * `make deploy`: deploys site +* `make lint`: check syntax +* `make test`: run tests +* `make serve`: run docs locally on http://127.0.0.1:8000/oscem-schemas/ +* `make clean` : remove generated files +
## Credits diff --git a/project/excel/oscem_schemas.xlsx b/project/excel/oscem_schemas.xlsx index da7f3dbc144c99551f761fa9c68c921643524eaf..7c3a7bf03788eb8793d00931e3e82e0576b38cbe 100644 GIT binary patch delta 3323 zcmZuzc|4SB8=iOU*@v;r*apMc8EclYMajN&WNRWi!jK3>1}TRkdXweT#zDuLUZ+B~ zvKP^DkSR-Y6qQiqEBW4er~1xun)&0I=bG!jo_l$I_x(Ie1wN+%{4Vxv?4l?XiW?Qg zC7#3I#tkoCI#hgU&YyC0=lj}xr#Jg9#4qU0=*}MpBGEkQc5>ma&uPN_X_%6j&C9pK zo(cIHbuG?x-*Q_Z9o_Y@$f{$9*h+D1^&_`#EJN6aC;NlIrM_8Gh}h@*(!W6dyAR%c6jRn% zqt-Or!H?hbZuR{~vIceU6}w}ZRlj9kG`?1xUARUrSPTRXXP^xPM4kmG>iD!nV?isZSJveVSfkp$o$iSR1$ zEm9DIRsbVTHaH=WCU*)Tz|2gp$*)?%01DLufUSa(bh2g~EzHsNLHK<+q0iVeg4|A} z6wxOaAA9VHzb;xD65q8nZVOzz*BHLpl5{{>IVL9dv?R$kT6vPqWwkPQiMWvd`g9ci zwIy$>6|a(mceJ-lQq9bSv5=$uq0Wfq&sm`a{>qGDMpH#w@&&ycu?4dAVs96PMYD)L zP(x(4AKm%4_R4!10u#xUFgf-f@k_QL+WU%orRs@{8bd~Ujsb;u_DjV;Kt66sv^~`Q zrs;7s$Ic9lyp;J3w$fs^!^A(M~)YGgvPbr%j;vVIR(k?!} z4(KVLBa5jnpa>X1t^)g6WhlRF%LqZEP^(-Z6(a*Z6O2Y93Pv#-7ad`Rqp*T3bOPha zvK|#t1Sd^7Zia1`>`}WXW;W!fDIPicDqX7aj!A*t56uyis3Eloi*_J+Q>nX&_%;W=mD z9E?tAKl2oDe(RI@C)L&as*nHls76Tg_ zRRn9o&{%n)^wHQ=c~s*&i%K_%>+8b;Rk*ZzoUE5)?`EEJUjo|>KaRb@@|0`ijyiOn z@%e>Dl3i4K+iTge?4I<9Wj9HCzo8=p!W9wfOKi5}uI$vaP6?%RnHp(_Qd6B0N*H>B z2K0t}N(?c$#h)Jjan-Mwo_IV<(5Hb6FI_c$;E8_`xtSI@lqxwWtTOj zyycPLUhdqcr0j;@BEn-$pJ zo~yvGQn;GYl~$>irlH!?s@q@B<|{*P>16Drhd3+0nPeEaY2I11GYihyY~d9YU;m)> z&la-2I96*4-{5{h6bc8AtGF;N>XD$ZD6QCtBcTBi;6npRzRMZL!k*zzo$gwk#DYr( zSh^!Ud83@>P~|6H(J0v4Ol!=pRPFj=z2M?;OW%L`IDD5|YaHZrnz2IfdXyc8Yo(aF-I@8KGGC4456-4vsee&^fm+z~1T^iTM-NAtT zs`GykJ-(8+(%XHj=mH&~CcL5H4c`ok1q`v5V5K1}j_*=C$zwY)nYw zJfvdLbO)kd|JcPT1Hw~9%W$hkyOd|CaUgp$&$<#%q6pdv!>+7Yq$uI^i;c6ZPpPMRG&F> z*RI!GTkHYn*|Vos_D7b-wD+Xm_V2o@K6ixEfsfPrC*%LLl_iGgFZaIW327KqiQhLp zbG=A<4v2mTbvybm=ns^xdFPU+DL&)#Y4)2BuC)!+C>iv1%ZR;@WP}dUX&du5XbFB+ z+!ZNds@BJII3JAdhVn;n0g-zTIPdlxtw`<5xAD(*Ez-Y+-O)n z!xl~ElCF!!6`eEs9X0of*8MnU&1{?HuK6DOx9YB+o*SmdJjZ&J7tZj|?`SU`#CYBI zO?)^xclQr-!(XmqUS#af4h4O-Q&dv;4s^DXSD!VkQ|ZpPL;Zif*@UY46rr=u?qUz1 zMcKYTlfc&PCg0ylAlldvX^f`E6l6VNY`yiVFkoyX$84?N2O-=yCE#29?UR)JW*Z2Y zV?h%W;jbEabTA(i64hfqF}6D3Y=TF>;YUp1F$q32;Y0L4B_(>h!8I-am;OOPgv@Ws z(r3W-Z-o%Z{VPN;#iO%C5U9XZ7?G0>31|z1<*NTBCyYgilV5F(&G6_-F&Gj9mCRTt zFdh6w1cf2{^i1o z0%En#oMokEjz>ok5vbIhmA15r{8uut-AneZC-N!7L@c;qjzOy20NeVjAQ0ICfzDgt z(XUhyq$oP$*Uh)@1hKEf>`5`|E%kg@Rl5_fHaFs}ELN zN+Y3dZR+1xNx-5Z*kmB(xmERh&k{nRM82`%H3>Md9fk6-jtGwq3Xi6G96KBo<;Mz- RgOkZ4z~2ej6>bye?tc`bxz7Lq delta 2948 zcmZuzc_38l8$M?=vTKZ)jG-AdV<+oaW{g24TUl=z3Q3fG$cffy=f`Cdj=oTD{h-IaagI$hoa^7 zZJc@~)`tMPdNYPAcJ<5CR(H;&DXuIdi8Ynh<+`^(P$=Wnc6xM2)v=K zw*z|fC0+EO{d)R+d$;xU;f;b^Zw>ZN`El7s+F4Oz`aJ<{ZtHB=>2C_drUr$l((m}q z#DLQ~a+}8$!p?4k9`Acs|9n?+cF?JuvNKg?WyZcYwl^NDpv)VcpMIjyy>Pf|;%+P< zO*mmb?*nE@SKLo|^8W#u!a{Is_}U`Lpx^@fC`JSI_!My$G}IQML94`<^9v-lEZ&!- zfd+hvloKc^Xz8cK1g3R9o+$Iv3L41ZQ*p5v#5fO6gD5yGzZJje zw2DB3n($b@H6aA`5^rm7w1>Sm3A{iPzKfI-Gags?+FR2fgGEG{H>vaSeHB*j$)@nEE?P z+`5_$r=75xhlIyzbSRXA<*U;c8 zm(^@g%8WW4)a5H^l%rv{rXc0Fn%B{=QkxFy^B-wPqv2*9I^=DM<;UrSBLM%k?mpCc zkHJf%<8s$D)uJ!}upQcFxQ=(BYX9c_IlqmSHD0Vc@+h=u)>b{zhJUH1_U2({NJA69mU0G+6_1tZCdm@7>d_x5PwZZ3(KAfya1iy@7${Ot zQonZ7bTVjtQUCs4V)ab^lb+~Nf=}od%>XZJra`^MFEhTxy-oCWMPh`XcppUPH07<= zxJ=9&IeaM1CPbXgIvGKv&$nu1wsn)Y*A2$w$h}9lR>g%xo?G9mD^$0!JzB%`=CH$5 z;>y|3BYj>@+yW1uk#kWlMe3#!B{*hW)CFUfwXLg8#&+X~igd;=A+e`sJ*vASWQy%Z zMY%7{`sgfixB8ylRMY9g$2^WmyQsNnYJTiUm#u8&%T8u$FEH|O&Csh2e|lDu=g&Pe zJz2nH%_75pgDKnVJ6l!{(b&~q%&Bme}Y+HhvPMc^{AF!PH7|=88V_u4t^uKI(DcwtspEURp74a&CPbob$Mp zTV#9pQI107g}?9AD87GZnc-7yyD7(WuJ?dz;llL}P8QCwCbjTFVj)4cd>K!+{Ct2` zfoe*jJ*P)FoqW>mR2kJj&yW@K|eFEjM` zu#wU*%_7Y5woUR#Y8texO_Zb}dXyYBv@vX`;ExT-f9#q8wQq%|93>;@jlMT4D3XWN z0z7@2J$jC|@L7!u4GKoe{?@TOxh?r`N0u*bTZa5-aX8#I!xaF42cRA+0(8P;6)#TW zK+_exn6pNwmFq;%4*I!<+4ePxYNW<;Gw)ixCohaccf6NA>@$#OH>s|7W-H@x3o=GbYf1%9 z+Kf+dvmF~Ee4Oo)*onVZf@vF8l6#)v{>qgiF}5UxCvJLK;H!RCcudzpt9dSAu&U zTls|->C@EE=POM+2CwQk4{QS-&1>bx!y^gA$O?TO)zC^NQ$%o-3uZOMWf~!~;{=n9 ztbI%?Wc6W@AqGp8Dj?oXo=w>dw>$wp6XoFH{_iI-Nl6?ErxGBDg+oNIS!B#b2?QEo z;SlZD>Ggw_B83nsW~esKjEpIfMj*dMs0oIwWl$Cl3sss)AeM@Ib~NvV(<%SKvJ;Px z;gP5DUD57eC*KdEosbe+1xeqIO~$+=!WKj*fsJM*fOg9vkhdHb>SRkGOsY8p!e4h+yanRQ2<-{l0z^$=|t6Z8y*=l6RP!5_zC#=<=AyDligtH)HTImQh&p~Sn z>~srug6-meup_BLS(Zd-ods%_4{Oh>Ay9?|ss-N;u*zYr&$91RiO~=cW%d56CM`=c z#zPA+B3YtFtuKaM{9&W9ACmZ}jS#&p(Il>0l6kp001z9rHZm$M$S?9gHgK=A{wuv1 zek?@TP5l2K6G+ep0IvwYpvbk_g75FT?f&&ofd~LdFA;u$h47v+p%H ; + owl:onProperty ], + [ a owl:Restriction ; + owl:minCardinality 1 ; + owl:onProperty ], + [ a owl:Restriction ; owl:allValuesFrom ; owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom ; - owl:onProperty ], + owl:minCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom ; - owl:onProperty ], + owl:maxCardinality 1 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:minCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom ; owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 1 ; + owl:allValuesFrom ; owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:minCardinality 1 ; + owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], + owl:allValuesFrom ; + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom ; - owl:onProperty ], - [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ] ; + owl:onProperty ] ; skos:definition "OSC-EM Metadata for a dataset" ; skos:inScheme . @@ -99,260 +99,255 @@ linkml:ClassDefinition ; rdfs:label "Acquisition" ; rdfs:subClassOf [ a owl:Restriction ; - owl:allValuesFrom ; - owl:onProperty ], + owl:allValuesFrom linkml:String ; + owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ], + owl:allValuesFrom linkml:Float ; + owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], + owl:minCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ], + owl:allValuesFrom linkml:Integer ; + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom linkml:String ; owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:Float ; + owl:minCardinality 0 ; owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], + owl:minCardinality 0 ; + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom ; + owl:minCardinality 0 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:minCardinality 0 ; owl:onProperty ], + [ a owl:Restriction ; + owl:minCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom ; - owl:onProperty ], + owl:allValuesFrom linkml:Integer ; + owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:Integer ; owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom ; - owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:datetime ; - owl:onProperty ], + owl:minCardinality 0 ; + owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], + owl:allValuesFrom linkml:Integer ; + owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ], + owl:minCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ], + owl:allValuesFrom ; + owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:String ; owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; - owl:onProperty ], + owl:minCardinality 0 ; + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 1 ; - owl:onProperty ], + owl:allValuesFrom linkml:Integer ; + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom ; - owl:onProperty ], + owl:maxCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ], + owl:maxCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ], + owl:allValuesFrom linkml:Float ; + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom ; + owl:maxCardinality 1 ; owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom linkml:Integer ; - owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], + owl:allValuesFrom ; + owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:String ; - owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom linkml:Integer ; - owl:onProperty ], - [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom linkml:Float ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; - owl:onProperty ], + owl:allValuesFrom linkml:Float ; + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:Integer ; - owl:onProperty ], + owl:minCardinality 0 ; + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; - owl:onProperty ], + owl:allValuesFrom ; + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ], + owl:allValuesFrom ; + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], + owl:allValuesFrom linkml:String ; + owl:onProperty ], + [ a owl:Restriction ; + owl:minCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom linkml:Float ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ], + owl:allValuesFrom ; + owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 1 ; - owl:onProperty ], + owl:maxCardinality 1 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom linkml:String ; + owl:onProperty ], + [ a owl:Restriction ; + owl:minCardinality 0 ; + owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:String ; owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom ; + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], + [ a owl:Restriction ; + owl:maxCardinality 1 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom ; + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom ; + owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom [ owl:intersectionOf ( [ a rdfs:Datatype ; + owl:unionOf ( linkml:datetime linkml:Date ) ] ) ] ; + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom ; - owl:onProperty ], + owl:maxCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom ; owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:Integer ; - owl:onProperty ], + owl:maxCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:Integer ; - owl:onProperty ], + owl:minCardinality 0 ; + owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 1 ; - owl:onProperty ], + owl:minCardinality 0 ; + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; - owl:onProperty ], + owl:allValuesFrom linkml:Integer ; + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:Float ; - owl:onProperty ], - [ a owl:Restriction ; - owl:minCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], + owl:minCardinality 0 ; + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom ; - owl:onProperty ] ; + owl:allValuesFrom linkml:Float ; + owl:onProperty ] ; skos:inScheme . a owl:Class, linkml:ClassDefinition ; rdfs:label "ChromaticAberrationCorrector" ; rdfs:subClassOf [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; - owl:onProperty ], - [ a owl:Restriction ; - owl:minCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; owl:minCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; @@ -363,13 +358,28 @@ owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ] ; + owl:onProperty ], + [ a owl:Restriction ; + owl:minCardinality 1 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom linkml:String ; + owl:onProperty ] ; skos:inScheme . a owl:Class, linkml:ClassDefinition ; rdfs:label "EnergyFilter" ; rdfs:subClassOf [ a owl:Restriction ; + owl:allValuesFrom linkml:String ; + owl:onProperty ], + [ a owl:Restriction ; + owl:minCardinality 1 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom linkml:Boolean ; + owl:onProperty ], + [ a owl:Restriction ; owl:allValuesFrom linkml:Integer ; owl:onProperty ], [ a owl:Restriction ; @@ -377,25 +387,16 @@ owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; + owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:Boolean ; - owl:onProperty ], - [ a owl:Restriction ; - owl:minCardinality 1 ; - owl:onProperty ] ; + owl:maxCardinality 1 ; + owl:onProperty ] ; skos:inScheme . a owl:Class, @@ -403,21 +404,21 @@ rdfs:label "Phaseplate" ; rdfs:subClassOf [ a owl:Restriction ; owl:minCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:Boolean ; owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; + owl:allValuesFrom linkml:String ; owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; + owl:minCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; - owl:onProperty ], + owl:maxCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 1 ; + owl:maxCardinality 1 ; owl:onProperty ] ; skos:inScheme . @@ -426,30 +427,30 @@ rdfs:label "SpecialistOptics" ; rdfs:subClassOf [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom ; owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom ; - owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 0 ; + owl:allValuesFrom ; owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:maxCardinality 1 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom ; owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; + owl:minCardinality 0 ; owl:onProperty ] ; skos:inScheme . @@ -457,91 +458,91 @@ linkml:ClassDefinition ; rdfs:label "SphericalAberrationCorrector" ; rdfs:subClassOf [ a owl:Restriction ; - owl:minCardinality 1 ; + owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:Boolean ; - owl:onProperty ], + owl:allValuesFrom linkml:String ; + owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; + owl:minCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; - owl:onProperty ] ; + owl:allValuesFrom linkml:Boolean ; + owl:onProperty ] ; skos:inScheme . a owl:Class, linkml:ClassDefinition ; rdfs:label "Instrument" ; rdfs:subClassOf [ a owl:Restriction ; - owl:maxCardinality 1 ; + owl:allValuesFrom linkml:Integer ; + owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom linkml:String ; owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 1 ; - owl:onProperty ], + owl:allValuesFrom linkml:Integer ; + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:minCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:minCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:Integer ; - owl:onProperty ], + owl:minCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:Float ; - owl:onProperty ], + owl:minCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:String ; owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom linkml:Float ; + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 1 ; - owl:onProperty ], + owl:onProperty ], + [ a owl:Restriction ; + owl:maxCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; + owl:maxCardinality 1 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], + owl:allValuesFrom linkml:String ; + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:Integer ; - owl:onProperty ] ; + owl:allValuesFrom linkml:String ; + owl:onProperty ], + [ a owl:Restriction ; + owl:minCardinality 1 ; + owl:onProperty ] ; skos:definition "Instrument values, mostly constant across a data collection." ; skos:inScheme . @@ -549,38 +550,44 @@ linkml:ClassDefinition ; rdfs:label "Author" ; rdfs:subClassOf [ a owl:Restriction ; - owl:minCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; owl:allValuesFrom owl:Thing ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom owl:Thing ; - owl:onProperty ], + owl:allValuesFrom linkml:String ; + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; owl:onProperty ], + [ a owl:Restriction ; + owl:maxCardinality 1 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:maxCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:String ; owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; - owl:onProperty ], + owl:minCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom ; - owl:onProperty ], + owl:maxCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], + [ a owl:Restriction ; + owl:minCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; owl:onProperty ], @@ -588,26 +595,23 @@ owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:minCardinality 1 ; - owl:onProperty ], + owl:allValuesFrom linkml:String ; + owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom owl:Thing ; - owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; - owl:onProperty ], + owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom ; + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 1 ; owl:onProperty ], - [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 1 ; owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom owl:Thing ; + owl:onProperty ], ; skos:inScheme . @@ -615,59 +619,59 @@ linkml:ClassDefinition ; rdfs:label "Grant" ; rdfs:subClassOf [ a owl:Restriction ; + owl:maxCardinality 1 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:minCardinality 0 ; + owl:onProperty ], + [ a owl:Restriction ; owl:allValuesFrom linkml:String ; owl:onProperty ], - [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; - owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], + [ a owl:Restriction ; + owl:maxCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:Date ; owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; - owl:onProperty ], - [ a owl:Restriction ; - owl:maxCardinality 1 ; + owl:minCardinality 0 ; owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; + owl:minCardinality 0 ; owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 0 ; + owl:allValuesFrom ; owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], + owl:allValuesFrom linkml:String ; + owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:Date ; owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ], + owl:maxCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 0 ; + owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom ; - owl:onProperty ] ; + owl:allValuesFrom linkml:String ; + owl:onProperty ] ; skos:definition "Grant" ; skos:exactMatch ; skos:inScheme . @@ -679,21 +683,21 @@ rdfs:subClassOf [ a owl:Restriction ; owl:allValuesFrom linkml:String ; owl:onProperty ], + [ a owl:Restriction ; + owl:minCardinality 0 ; + owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom ; owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ] ; + owl:onProperty ] ; skos:definition "A class representing an organization" ; skos:inScheme . @@ -701,8 +705,23 @@ linkml:ClassDefinition ; rdfs:label "Person" ; rdfs:subClassOf [ a owl:Restriction ; + owl:maxCardinality 1 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom [ a rdfs:Datatype ; + owl:intersectionOf ( linkml:String [ a rdfs:Datatype ; + owl:onDatatype xsd:string ; + owl:withRestrictions ( [ xsd:pattern "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$" ] ) ] ) ] ; + owl:onProperty ], + [ a owl:Restriction ; owl:allValuesFrom linkml:Boolean ; owl:onProperty ], + [ a owl:Restriction ; + owl:maxCardinality 1 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:maxCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; owl:onProperty ], @@ -712,41 +731,26 @@ [ a owl:Restriction ; owl:minCardinality 0 ; owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom [ a rdfs:Datatype ; - owl:intersectionOf ( linkml:String [ a rdfs:Datatype ; - owl:onDatatype xsd:string ; - owl:withRestrictions ( [ xsd:pattern "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$" ] ) ] ) ] ; - owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; - owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; + owl:minCardinality 0 ; owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; + owl:allValuesFrom linkml:String ; owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:minCardinality 0 ; + owl:allValuesFrom linkml:String ; owl:onProperty ] ; skos:exactMatch ; skos:inScheme . @@ -755,14 +759,11 @@ linkml:ClassDefinition ; rdfs:label "QuantityValue" ; rdfs:subClassOf [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; owl:allValuesFrom linkml:Double ; owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ], + owl:maxCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:String ; owl:onProperty ], @@ -771,18 +772,14 @@ owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; - owl:onProperty ] ; + owl:onProperty ], + [ a owl:Restriction ; + owl:minCardinality 0 ; + owl:onProperty ] ; skos:definition "Value together with unit" ; skos:exactMatch ; skos:inScheme . - a owl:ObjectProperty, - linkml:SlotDefinition ; - rdfs:label "institution" ; - rdfs:range ; - skos:definition "institution" ; - skos:inScheme . - a owl:Class, ; rdfs:label "Antibiotic" ; @@ -844,104 +841,104 @@ rdfs:label "Grid" ; dcterms:title "Grid" ; rdfs:subClassOf [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], + owl:allValuesFrom linkml:Float ; + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom linkml:String ; + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 0 ; + owl:allValuesFrom linkml:Float ; + owl:onProperty ], + [ a owl:Restriction ; + owl:maxCardinality 1 ; owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom linkml:String ; + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:Float ; - owl:onProperty ], + owl:allValuesFrom linkml:String ; + owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ], + owl:allValuesFrom linkml:Boolean ; + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; + owl:minCardinality 0 ; owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], + owl:minCardinality 0 ; + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; - owl:onProperty ], + owl:minCardinality 0 ; + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:minCardinality 0 ; owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; - owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; + owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:String ; - owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom linkml:Float ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:String ; - owl:onProperty ], + owl:onProperty ], + [ a owl:Restriction ; + owl:maxCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], + owl:allValuesFrom linkml:Float ; + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; + owl:minCardinality 0 ; owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:String ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:Boolean ; - owl:onProperty ], + owl:minCardinality 0 ; + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 0 ; + owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:Float ; - owl:onProperty ] ; + owl:allValuesFrom linkml:String ; + owl:onProperty ] ; skos:definition "A class representing a grid" ; skos:inScheme . @@ -950,32 +947,32 @@ rdfs:label "Ligand" ; dcterms:title "Ligand" ; rdfs:subClassOf [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ], + owl:maxCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; + owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], + owl:minCardinality 0 ; + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; + owl:minCardinality 0 ; owl:onProperty ], - [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; + owl:allValuesFrom linkml:String ; owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:Boolean ; - owl:onProperty ], + owl:allValuesFrom linkml:String ; + owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ] ; + owl:maxCardinality 1 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom linkml:Boolean ; + owl:onProperty ] ; skos:definition "A class representing a ligand" ; skos:inScheme . @@ -984,86 +981,86 @@ rdfs:label "Molecule" ; dcterms:title "Molecule" ; rdfs:subClassOf [ a owl:Restriction ; - owl:minCardinality 1 ; - owl:onProperty ], + owl:allValuesFrom ; + owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 1 ; + owl:maxCardinality 1 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom linkml:String ; owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:minCardinality 0 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom linkml:String ; owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom linkml:String ; + owl:onProperty ], + [ a owl:Restriction ; + owl:maxCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:String ; owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; - owl:onProperty ], - [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 1 ; - owl:onProperty ], + owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom linkml:String ; + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; - owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], + owl:allValuesFrom linkml:String ; + owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 1 ; - owl:onProperty ], + owl:allValuesFrom linkml:String ; + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:String ; - owl:onProperty ], - [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; - owl:onProperty ], + owl:minCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; - owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom ; - owl:onProperty ], + owl:minCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; - owl:onProperty ] ; + owl:minCardinality 1 ; + owl:onProperty ] ; skos:definition "A class representing a molecule" ; skos:inScheme . @@ -1072,41 +1069,41 @@ rdfs:label "OverallMolecule" ; dcterms:title "OverallMolecule" ; rdfs:subClassOf [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ], + owl:maxCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom linkml:Float ; owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; + owl:allValuesFrom linkml:String ; owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 1 ; + owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:String ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; + owl:minCardinality 1 ; owl:onProperty ], + [ a owl:Restriction ; + owl:minCardinality 0 ; + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom linkml:String ; owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; - owl:onProperty ] ; + owl:allValuesFrom linkml:Float ; + owl:onProperty ] ; skos:definition "A class representing the overall molecule" ; skos:inScheme . @@ -1115,25 +1112,25 @@ rdfs:label "Sample" ; dcterms:title "Sample" ; rdfs:subClassOf [ a owl:Restriction ; - owl:minCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; owl:minCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom ; - owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom ; + owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; + owl:allValuesFrom ; owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:minCardinality 1 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:minCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; + owl:allValuesFrom ; owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom ; @@ -1142,17 +1139,17 @@ owl:minCardinality 0 ; owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 1 ; - owl:onProperty ], + owl:maxCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 0 ; + owl:allValuesFrom ; owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom ; - owl:onProperty ], + owl:minCardinality 0 ; + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom ; - owl:onProperty ] ; + owl:allValuesFrom ; + owl:onProperty ] ; skos:definition "A class representing a sample" ; skos:inScheme . @@ -1161,95 +1158,95 @@ rdfs:label "Specimen" ; dcterms:title "Specimen" ; rdfs:subClassOf [ a owl:Restriction ; - owl:allValuesFrom linkml:Float ; - owl:onProperty ], - [ a owl:Restriction ; owl:minCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:Float ; owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 1 ; - owl:onProperty ], + owl:minCardinality 0 ; + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:Boolean ; - owl:onProperty ], + owl:allValuesFrom linkml:String ; + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:Float ; - owl:onProperty ], + owl:maxCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 1 ; owl:onProperty ], - [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom linkml:Boolean ; - owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom linkml:Float ; owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom linkml:Boolean ; + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 1 ; + owl:maxCardinality 1 ; owl:onProperty ], - [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:String ; owl:onProperty ], - [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:Boolean ; owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:String ; - owl:onProperty ], + owl:minCardinality 1 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom linkml:Boolean ; + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 1 ; - owl:onProperty ], + owl:minCardinality 0 ; + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:Boolean ; + owl:minCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], + owl:minCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], + [ a owl:Restriction ; + owl:minCardinality 1 ; + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 1 ; + owl:maxCardinality 1 ; owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom linkml:Boolean ; + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom linkml:Float ; owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ] ; + owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom linkml:Float ; + owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom linkml:Float ; + owl:onProperty ] ; skos:definition "A class representing a specimen" ; skos:inScheme . @@ -1269,26 +1266,35 @@ skos:definition "List of molecule associated with the sample" ; skos:inScheme . + a owl:Class, + linkml:ClassDefinition ; + rdfs:label "Any" ; + skos:definition """Any type, used as the base for type-narrowing. + +See https://linkml.io/linkml/schemas/advanced.html""" ; + skos:exactMatch linkml:Any ; + skos:inScheme . + a owl:Class, linkml:ClassDefinition ; rdfs:label "ImageSize" ; rdfs:subClassOf [ a owl:Restriction ; - owl:allValuesFrom linkml:Integer ; + owl:maxCardinality 1 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:Integer ; - owl:onProperty ], - [ a owl:Restriction ; - owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; + owl:allValuesFrom linkml:Integer ; owl:onProperty ] ; skos:definition "size of a 2D image (in integer units)" ; skos:inScheme . @@ -1352,7 +1358,8 @@ a owl:ObjectProperty, linkml:SlotDefinition ; rdfs:label "datetime" ; - rdfs:range linkml:datetime ; + rdfs:range [ owl:intersectionOf ( [ a rdfs:Datatype ; + owl:unionOf ( linkml:datetime linkml:Date ) ] ) ] ; skos:definition "Time and date of the data acquisition" ; skos:inScheme . @@ -1620,6 +1627,13 @@ skos:definition "Value" ; skos:inScheme . + a owl:ObjectProperty, + linkml:SlotDefinition ; + rdfs:label "institution" ; + rdfs:range ; + skos:definition "author's institution" ; + skos:inScheme . + a owl:ObjectProperty, linkml:SlotDefinition ; rdfs:label "name_org" ; @@ -2087,48 +2101,47 @@ dcterms:title "Type" ; rdfs:range linkml:String ; skos:definition "Description of the overall supramolecular type, i.e., a complex" ; - skos:inScheme ; - skos:prefLabel "type" . + skos:inScheme . a owl:Class, linkml:ClassDefinition ; rdfs:label "BoundingBox2D" ; rdfs:subClassOf [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:Float ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:maxCardinality 1 ; + owl:minCardinality 0 ; owl:onProperty ], - [ a owl:Restriction ; - owl:allValuesFrom linkml:Float ; - owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:Float ; owl:onProperty ], - [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ], [ a owl:Restriction ; owl:minCardinality 0 ; owl:onProperty ], + [ a owl:Restriction ; + owl:allValuesFrom linkml:Float ; + owl:onProperty ], [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 0 ; + owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:Float ; - owl:onProperty ] ; + owl:onProperty ], + [ a owl:Restriction ; + owl:maxCardinality 1 ; + owl:onProperty ], + [ a owl:Restriction ; + owl:minCardinality 0 ; + owl:onProperty ] ; skos:definition "an axis-aligned 2D bounding box (float units)" ; skos:inScheme . @@ -2143,23 +2156,23 @@ linkml:ClassDefinition ; rdfs:label "Range" ; rdfs:subClassOf [ a owl:Restriction ; + owl:minCardinality 0 ; + owl:onProperty ], + [ a owl:Restriction ; owl:maxCardinality 1 ; - owl:onProperty ], + owl:onProperty ], [ a owl:Restriction ; - owl:allValuesFrom linkml:Float ; + owl:maxCardinality 1 ; owl:onProperty ], [ a owl:Restriction ; owl:allValuesFrom linkml:Float ; owl:onProperty ], [ a owl:Restriction ; - owl:minCardinality 0 ; - owl:onProperty ], - [ a owl:Restriction ; - owl:minCardinality 0 ; + owl:allValuesFrom linkml:Float ; owl:onProperty ], [ a owl:Restriction ; - owl:maxCardinality 1 ; - owl:onProperty ] ; + owl:minCardinality 0 ; + owl:onProperty ] ; skos:definition "A range constructed from min and max" ; skos:inScheme . @@ -2168,8 +2181,7 @@ rdfs:label "instrument_type" ; rdfs:range linkml:String ; skos:definition "Details of a given specialist instrument" ; - skos:inScheme ; - skos:prefLabel "type" . + skos:inScheme . a owl:Class, linkml:EnumDefinition ; diff --git a/project/prefixmap/oscem_schemas.yaml b/project/prefixmap/oscem_schemas.yaml index 6e69cec..88da68c 100644 --- a/project/prefixmap/oscem_schemas.yaml +++ b/project/prefixmap/oscem_schemas.yaml @@ -8,6 +8,9 @@ "Acquisition": { "@id": "acquisition:Acquisition" }, + "Any": { + "@id": "linkml:Any" + }, "Author": { "@id": "https://w3id.org/osc-em/organizational/Author" }, diff --git a/project/protobuf/oscem_schemas.proto b/project/protobuf/oscem_schemas.proto index dbca04e..16149f6 100644 --- a/project/protobuf/oscem_schemas.proto +++ b/project/protobuf/oscem_schemas.proto @@ -16,7 +16,7 @@ message Acquisition float dosePerMovie = 0 energyFilter energyFilter = 0 imageSize imageSize = 0 - datetime datetime = 0 + any datetime = 0 float exposureTime = 0 string cryogen = 0 integer framesPerMovie = 0 @@ -35,7 +35,7 @@ message Author { string firstName = 0 boolean workStatus = 0 - repeated institution institution = 0 + institution institution = 0 string orcid = 0 string country = 0 string role = 0 @@ -54,7 +54,7 @@ message BoundingBox2D message ChromaticAberrationCorrector { boolean used = 0 - string type = 0 + string instrumentType = 0 } // OSC-EM Metadata for a dataset message EMDataset @@ -130,7 +130,7 @@ message Ligand message Molecule { string nameMol = 0 - string type = 0 + string molecularType = 0 moleculeClassEnum molecularClass = 0 string sequence = 0 string naturalSource = 0 @@ -142,7 +142,7 @@ message Molecule // A class representing the overall molecule message OverallMolecule { - string type = 0 + string molecularType = 0 string nameSample = 0 string source = 0 float molecularWeight = 0 @@ -158,7 +158,7 @@ message Person message Phaseplate { boolean used = 0 - string type = 0 + string instrumentType = 0 } // Value together with unit message QuantityValue @@ -211,7 +211,7 @@ message Specimen message SphericalAberrationCorrector { boolean used = 0 - string type = 0 + string instrumentType = 0 } // The min, max and increment of the tilt angle in a tomography session. Unit is degree. message TiltAngle diff --git a/project/shacl/oscem_schemas.shacl.ttl b/project/shacl/oscem_schemas.shacl.ttl index 900f3ab..05a4339 100644 --- a/project/shacl/oscem_schemas.shacl.ttl +++ b/project/shacl/oscem_schemas.shacl.ttl @@ -1,20 +1,22 @@ +@prefix linkml: . @prefix rdf: . @prefix rdfs: . @prefix sh: . @prefix xsd: . +linkml:Any a sh:NodeShape ; + sh:closed true ; + sh:description """Any type, used as the base for type-narrowing. + +See https://linkml.io/linkml/schemas/advanced.html""" ; + sh:ignoredProperties ( rdf:type ) ; + sh:targetClass linkml:Any . + a sh:NodeShape ; sh:closed true ; sh:description "OSC-EM Metadata for a dataset" ; sh:ignoredProperties ( rdf:type ) ; - sh:property [ sh:class ; - sh:description "List of grants associated with the project" ; - sh:minCount 1 ; - sh:name "Grants" ; - sh:nodeKind sh:BlankNodeOrIRI ; - sh:order 3 ; - sh:path ], - [ sh:class ; + sh:property [ sh:class ; sh:description "Sample information" ; sh:maxCount 1 ; sh:minCount 1 ; @@ -22,14 +24,21 @@ sh:nodeKind sh:BlankNodeOrIRI ; sh:order 2 ; sh:path ], - [ sh:class ; - sh:description "Describe the instrument used to acquire the data" ; + [ sh:class ; + sh:description "Describe the data acquisition parameters" ; sh:maxCount 1 ; sh:minCount 1 ; - sh:name "Instrument" ; + sh:name "Acquisition" ; sh:nodeKind sh:BlankNodeOrIRI ; - sh:order 1 ; - sh:path ], + sh:order 0 ; + sh:path ], + [ sh:class ; + sh:description "List of grants associated with the project" ; + sh:minCount 1 ; + sh:name "Grants" ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:order 3 ; + sh:path ], [ sh:class ; sh:description "List of authors associated with the project" ; sh:minCount 1 ; @@ -37,14 +46,14 @@ sh:nodeKind sh:BlankNodeOrIRI ; sh:order 4 ; sh:path ], - [ sh:class ; - sh:description "Describe the data acquisition parameters" ; + [ sh:class ; + sh:description "Describe the instrument used to acquire the data" ; sh:maxCount 1 ; sh:minCount 1 ; - sh:name "Acquisition" ; + sh:name "Instrument" ; sh:nodeKind sh:BlankNodeOrIRI ; - sh:order 0 ; - sh:path ] ; + sh:order 1 ; + sh:path ] ; sh:targetClass . a sh:NodeShape ; @@ -53,11 +62,11 @@ sh:description "The min, max and increment of the tilt angle in a tomography session. Unit is degree." ; sh:ignoredProperties ( rdf:type ) ; sh:property [ sh:datatype xsd:float ; - sh:description "Minimal value of a given dataset property" ; + sh:description "Maximal value of a given dataset property" ; sh:maxCount 1 ; sh:nodeKind sh:Literal ; - sh:order 1 ; - sh:path ], + sh:order 2 ; + sh:path ], [ sh:datatype xsd:float ; sh:description "Increment between elements of a series" ; sh:maxCount 1 ; @@ -65,11 +74,11 @@ sh:order 0 ; sh:path ], [ sh:datatype xsd:float ; - sh:description "Maximal value of a given dataset property" ; + sh:description "Minimal value of a given dataset property" ; sh:maxCount 1 ; sh:nodeKind sh:Literal ; - sh:order 2 ; - sh:path ] ; + sh:order 1 ; + sh:path ] ; sh:targetClass . a sh:NodeShape ; @@ -106,12 +115,12 @@ sh:nodeKind sh:Literal ; sh:order 5 ; sh:path ], - [ sh:class ; - sh:description "budget" ; + [ sh:datatype xsd:date ; + sh:description "start date" ; sh:maxCount 1 ; - sh:nodeKind sh:BlankNodeOrIRI ; - sh:order 4 ; - sh:path ], + sh:nodeKind sh:Literal ; + sh:order 2 ; + sh:path ], [ sh:datatype xsd:date ; sh:description "end date" ; sh:maxCount 1 ; @@ -124,78 +133,108 @@ sh:nodeKind sh:Literal ; sh:order 1 ; sh:path ], - [ sh:datatype xsd:date ; - sh:description "start date" ; + [ sh:class ; + sh:description "budget" ; sh:maxCount 1 ; - sh:nodeKind sh:Literal ; - sh:order 2 ; - sh:path ] ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:order 4 ; + sh:path ] ; sh:targetClass . a sh:NodeShape ; sh:closed true ; sh:ignoredProperties ( rdf:type ) ; sh:property [ sh:datatype xsd:string ; - sh:description "work phone" ; + sh:description "email" ; sh:maxCount 1 ; sh:nodeKind sh:Literal ; - sh:order 4 ; - sh:path ], + sh:order 3 ; + sh:path ; + sh:pattern "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$" ], [ sh:datatype xsd:string ; - sh:description "first name" ; + sh:description "work phone" ; sh:maxCount 1 ; sh:nodeKind sh:Literal ; - sh:order 1 ; - sh:path ], + sh:order 4 ; + sh:path ], [ sh:datatype xsd:string ; sh:description "name" ; sh:maxCount 1 ; sh:nodeKind sh:Literal ; sh:order 0 ; sh:path ], - [ sh:datatype xsd:string ; - sh:description "email" ; - sh:maxCount 1 ; - sh:nodeKind sh:Literal ; - sh:order 3 ; - sh:path ; - sh:pattern "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$" ], [ sh:datatype xsd:boolean ; sh:description "work status" ; sh:maxCount 1 ; sh:nodeKind sh:Literal ; sh:order 2 ; - sh:path ] ; + sh:path ], + [ sh:datatype xsd:string ; + sh:description "first name" ; + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:order 1 ; + sh:path ] ; sh:targetClass . a sh:NodeShape ; sh:closed true ; sh:ignoredProperties ( rdf:type ) ; - sh:property [ sh:datatype xsd:integer ; - sh:description "Magnification level as indicated by the instrument, no unit" ; + sh:property [ sh:class ; + sh:description "Movement of the beam above the sample for data collection purposes that does not require movement of the stage. Given in mrad." ; + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:order 22 ; + sh:path ], + [ sh:datatype xsd:string ; + sh:description "Type of cryogen used in the holder - if the holder is cooled seperately" ; sh:maxCount 1 ; sh:nodeKind sh:Literal ; - sh:order 2 ; - sh:path ], + sh:order 5 ; + sh:path ], + [ sh:datatype xsd:integer ; + sh:description "Number of images generated total for this data collection - might need a qualifier for tilt series to determine whether full series or individual tilts are counted" ; + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:order 18 ; + sh:path ], + [ sh:datatype xsd:string ; + sh:description "Cryogen used in cooling the instrument and sample, usually nitrogen" ; + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:order 15 ; + sh:path ], + [ sh:class ; + sh:description "Any type of special optics, such as a phaseplate" ; + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:order 21 ; + sh:path ], [ sh:datatype xsd:float ; - sh:description "Pixel size, in Angstrom" ; + sh:description "Level of binning on the images applied during data collection" ; sh:maxCount 1 ; sh:minCount 1 ; sh:nodeKind sh:Literal ; - sh:order 20 ; - sh:path ], + sh:order 19 ; + sh:path ], + [ sh:datatype xsd:string ; + sh:description "Software used for instrument control," ; + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:order 7 ; + sh:path ], [ sh:class ; - sh:description "Temperature during data collection, in K with min and max values." ; + sh:description "Machine estimated defocus, min and max values in µm. Has a tendency to be off." ; sh:maxCount 1 ; sh:nodeKind sh:BlankNodeOrIRI ; - sh:order 6 ; - sh:path ], + sh:order 1 ; + sh:path ], [ sh:datatype xsd:integer ; - sh:description "Number of grids imaged for this project - here with qualifier during this data acquisition" ; + sh:description "Calculated magnification, no unit" ; sh:maxCount 1 ; sh:nodeKind sh:Literal ; - sh:order 17 ; - sh:path ], + sh:order 3 ; + sh:path ], [ sh:datatype xsd:float ; sh:description "Average dose per image/movie/tilt - given in electrons per square Angstrom" ; sh:maxCount 1 ; @@ -203,117 +242,92 @@ sh:nodeKind sh:Literal ; sh:order 10 ; sh:path ], - [ sh:datatype xsd:string ; - sh:description "Operating mode of the detector" ; - sh:maxCount 1 ; - sh:nodeKind sh:Literal ; - sh:order 9 ; - sh:path ], [ sh:datatype xsd:string ; sh:description "Whether and how you have to flip or rotate the gainref in order to align with your acquired images" ; sh:maxCount 1 ; sh:nodeKind sh:Literal ; sh:order 26 ; sh:path ], - [ sh:datatype xsd:integer ; - sh:description "Calculated magnification, no unit" ; - sh:maxCount 1 ; - sh:nodeKind sh:Literal ; - sh:order 3 ; - sh:path ], - [ sh:class ; - sh:description "Movement of the beam above the sample for data collection purposes that does not require movement of the stage. Given in mrad." ; - sh:maxCount 1 ; - sh:nodeKind sh:BlankNodeOrIRI ; - sh:order 22 ; - sh:path ], - [ sh:datatype xsd:dateTime ; - sh:description "Time and date of the data acquisition" ; - sh:maxCount 1 ; - sh:minCount 1 ; - sh:nodeKind sh:Literal ; - sh:order 13 ; - sh:path ], [ sh:datatype xsd:string ; - sh:description "Speciman holder model" ; + sh:description "Operating mode of the detector" ; sh:maxCount 1 ; sh:nodeKind sh:Literal ; - sh:order 4 ; - sh:path ], - [ sh:class ; - sh:description "Any type of special optics, such as a phaseplate" ; + sh:order 9 ; + sh:path ], + [ sh:class ; + sh:description "Temperature during data collection, in K with min and max values." ; sh:maxCount 1 ; sh:nodeKind sh:BlankNodeOrIRI ; - sh:order 21 ; - sh:path ], - [ sh:datatype xsd:integer ; - sh:description "Number of images generated total for this data collection - might need a qualifier for tilt series to determine whether full series or individual tilts are counted" ; - sh:maxCount 1 ; - sh:nodeKind sh:Literal ; - sh:order 18 ; - sh:path ], + sh:order 6 ; + sh:path ], [ sh:datatype xsd:integer ; sh:description "Number of Beamtilt groups present in this dataset - for optimized processing split dataset into groups of same tilt angle. Despite its name Beamshift is often used to achive this result." ; sh:maxCount 1 ; sh:nodeKind sh:Literal ; sh:order 25 ; sh:path ], - [ sh:datatype xsd:string ; - sh:description "Cryogen used in cooling the instrument and sample, usually nitrogen" ; + [ sh:datatype xsd:float ; + sh:description "Pixel size, in Angstrom" ; sh:maxCount 1 ; + sh:minCount 1 ; sh:nodeKind sh:Literal ; - sh:order 15 ; - sh:path ], - [ sh:class ; - sh:description "Another way to move the beam above the sample for data collection purposes that does not require movement of the stage. Given in mrad." ; - sh:maxCount 1 ; - sh:nodeKind sh:BlankNodeOrIRI ; - sh:order 23 ; - sh:path ], - [ sh:class ; - sh:description "Machine estimated defocus, min and max values in µm. Has a tendency to be off." ; - sh:maxCount 1 ; - sh:nodeKind sh:BlankNodeOrIRI ; - sh:order 1 ; - sh:path ], + sh:order 20 ; + sh:path ], [ sh:class ; sh:description "The size of the image in pixels, height and width given." ; sh:maxCount 1 ; sh:nodeKind sh:BlankNodeOrIRI ; sh:order 12 ; sh:path ], - [ sh:datatype xsd:float ; - sh:description "Level of binning on the images applied during data collection" ; + [ sh:datatype xsd:string ; + sh:description "Make and model of the detector used" ; sh:maxCount 1 ; sh:minCount 1 ; sh:nodeKind sh:Literal ; - sh:order 19 ; - sh:path ], - [ sh:class ; - sh:description "Wether an energy filter was used and its specifics." ; - sh:maxCount 1 ; - sh:nodeKind sh:BlankNodeOrIRI ; - sh:order 11 ; - sh:path ], - [ sh:datatype xsd:string ; - sh:description "Type of cryogen used in the holder - if the holder is cooled seperately" ; + sh:order 8 ; + sh:path ], + [ sh:datatype xsd:integer ; + sh:description "Number of frames that on average constitute a full movie, can be a bit hard to define for some detectors" ; sh:maxCount 1 ; sh:nodeKind sh:Literal ; - sh:order 5 ; - sh:path ], + sh:order 16 ; + sh:path ], [ sh:datatype xsd:float ; sh:description "Time of data acquisition per movie/tilt - in s" ; sh:maxCount 1 ; sh:nodeKind sh:Literal ; sh:order 14 ; sh:path ], + [ sh:datatype xsd:integer ; + sh:description "Magnification level as indicated by the instrument, no unit" ; + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:order 2 ; + sh:path ], + [ sh:class ; + sh:description "Wether an energy filter was used and its specifics." ; + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:order 11 ; + sh:path ], + [ sh:class ; + sh:description "Another way to move the beam above the sample for data collection purposes that does not require movement of the stage. Given in mrad." ; + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:order 23 ; + sh:path ], [ sh:datatype xsd:string ; - sh:description "Make and model of the detector used" ; + sh:description "Speciman holder model" ; sh:maxCount 1 ; - sh:minCount 1 ; sh:nodeKind sh:Literal ; - sh:order 8 ; - sh:path ], + sh:order 4 ; + sh:path ], + [ sh:datatype xsd:integer ; + sh:description "Number of grids imaged for this project - here with qualifier during this data acquisition" ; + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:order 17 ; + sh:path ], [ sh:class ; sh:description "Target defocus set, min and max values in µm." ; sh:maxCount 1 ; @@ -326,37 +340,33 @@ sh:nodeKind sh:BlankNodeOrIRI ; sh:order 24 ; sh:path ], - [ sh:datatype xsd:string ; - sh:description "Software used for instrument control," ; - sh:maxCount 1 ; - sh:nodeKind sh:Literal ; - sh:order 7 ; - sh:path ], - [ sh:datatype xsd:integer ; - sh:description "Number of frames that on average constitute a full movie, can be a bit hard to define for some detectors" ; + [ sh:description "Time and date of the data acquisition" ; sh:maxCount 1 ; - sh:nodeKind sh:Literal ; - sh:order 16 ; - sh:path ] ; + sh:minCount 1 ; + sh:or ( [ sh:datatype xsd:dateTime ; + sh:nodeKind sh:Literal ] [ sh:datatype xsd:date ; + sh:nodeKind sh:Literal ] ) ; + sh:order 13 ; + sh:path ] ; sh:targetClass . a sh:NodeShape ; sh:closed true ; sh:ignoredProperties ( rdf:type ) ; - sh:property [ sh:datatype xsd:string ; - sh:description "Details of a given specialist instrument" ; + sh:property [ sh:datatype xsd:boolean ; + sh:description "whether a specific instrument was used during data acquisition" ; sh:maxCount 1 ; sh:minCount 1 ; sh:nodeKind sh:Literal ; - sh:order 1 ; - sh:path ], - [ sh:datatype xsd:boolean ; - sh:description "whether a specific instrument was used during data acquisition" ; + sh:order 0 ; + sh:path ], + [ sh:datatype xsd:string ; + sh:description "Details of a given specialist instrument" ; sh:maxCount 1 ; sh:minCount 1 ; sh:nodeKind sh:Literal ; - sh:order 0 ; - sh:path ] ; + sh:order 1 ; + sh:path ] ; sh:targetClass . a sh:NodeShape ; @@ -368,39 +378,39 @@ sh:nodeKind sh:Literal ; sh:order 1 ; sh:path ], - [ sh:datatype xsd:integer ; - sh:description "The width of a given item - unit depends on item" ; - sh:maxCount 1 ; - sh:minCount 1 ; - sh:nodeKind sh:Literal ; - sh:order 2 ; - sh:path ], [ sh:datatype xsd:boolean ; sh:description "whether a specific instrument was used during data acquisition" ; sh:maxCount 1 ; sh:minCount 1 ; sh:nodeKind sh:Literal ; sh:order 0 ; - sh:path ] ; + sh:path ], + [ sh:datatype xsd:integer ; + sh:description "The width of a given item - unit depends on item" ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:order 2 ; + sh:path ] ; sh:targetClass . a sh:NodeShape ; sh:closed true ; sh:ignoredProperties ( rdf:type ) ; - sh:property [ sh:datatype xsd:boolean ; - sh:description "whether a specific instrument was used during data acquisition" ; + sh:property [ sh:datatype xsd:string ; + sh:description "Type of phaseplate" ; sh:maxCount 1 ; sh:minCount 1 ; sh:nodeKind sh:Literal ; - sh:order 0 ; - sh:path ], - [ sh:datatype xsd:string ; - sh:description "Type of phaseplate" ; + sh:order 1 ; + sh:path ], + [ sh:datatype xsd:boolean ; + sh:description "whether a specific instrument was used during data acquisition" ; sh:maxCount 1 ; sh:minCount 1 ; sh:nodeKind sh:Literal ; - sh:order 1 ; - sh:path ] ; + sh:order 0 ; + sh:path ] ; sh:targetClass . a sh:NodeShape ; @@ -449,19 +459,20 @@ sh:closed true ; sh:description "Instrument values, mostly constant across a data collection." ; sh:ignoredProperties ( rdf:type ) ; - sh:property [ sh:datatype xsd:integer ; - sh:description "C2 aperture size used in data acquisition, in µm" ; + sh:property [ sh:datatype xsd:string ; + sh:description "Mode of imaging used during data collection" ; sh:maxCount 1 ; + sh:minCount 1 ; sh:nodeKind sh:Literal ; - sh:order 5 ; - sh:path ], + sh:order 2 ; + sh:path ], [ sh:datatype xsd:string ; - sh:description "Name/Type of the Microscope" ; + sh:description "Mode of illumination used during data collection" ; sh:maxCount 1 ; sh:minCount 1 ; sh:nodeKind sh:Literal ; - sh:order 0 ; - sh:path ], + sh:order 1 ; + sh:path ], [ sh:datatype xsd:float ; sh:description "Spherical aberration of the instrument, in mm" ; sh:maxCount 1 ; @@ -469,20 +480,13 @@ sh:nodeKind sh:Literal ; sh:order 6 ; sh:path ], - [ sh:datatype xsd:integer ; - sh:description "Voltage used for the electron acceleration, in kV" ; - sh:maxCount 1 ; - sh:minCount 1 ; - sh:nodeKind sh:Literal ; - sh:order 4 ; - sh:path ], [ sh:datatype xsd:string ; - sh:description "Mode of imaging used during data collection" ; + sh:description "Name/Type of the Microscope" ; sh:maxCount 1 ; sh:minCount 1 ; sh:nodeKind sh:Literal ; - sh:order 2 ; - sh:path ], + sh:order 0 ; + sh:path ], [ sh:datatype xsd:string ; sh:description "Type of electron source used in the microscope, such as FEG" ; sh:maxCount 1 ; @@ -490,20 +494,41 @@ sh:nodeKind sh:Literal ; sh:order 3 ; sh:path ], - [ sh:datatype xsd:string ; - sh:description "Mode of illumination used during data collection" ; + [ sh:datatype xsd:integer ; + sh:description "Voltage used for the electron acceleration, in kV" ; sh:maxCount 1 ; sh:minCount 1 ; sh:nodeKind sh:Literal ; - sh:order 1 ; - sh:path ] ; + sh:order 4 ; + sh:path ], + [ sh:datatype xsd:integer ; + sh:description "C2 aperture size used in data acquisition, in µm" ; + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:order 5 ; + sh:path ] ; sh:targetClass . a sh:NodeShape ; rdfs:subClassOf ; sh:closed true ; sh:ignoredProperties ( rdf:type ) ; - sh:property [ sh:datatype xsd:string ; + sh:property [ sh:class ; + sh:description "author's institution" ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:order 0 ; + sh:path ], + [ sh:datatype xsd:string ; + sh:description "ORCID of the author, a type of unique identifier" ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:name "ORCID" ; + sh:nodeKind sh:Literal ; + sh:order 1 ; + sh:path ], + [ sh:datatype xsd:string ; sh:description "first name" ; sh:maxCount 1 ; sh:nodeKind sh:Literal ; @@ -516,28 +541,13 @@ sh:order 6 ; sh:path ], [ sh:datatype xsd:string ; - sh:description "work phone" ; - sh:maxCount 1 ; - sh:minCount 1 ; - sh:nodeKind sh:Literal ; - sh:order 8 ; - sh:path ], - [ sh:datatype xsd:string ; - sh:description "email" ; - sh:maxCount 1 ; - sh:minCount 1 ; - sh:nodeKind sh:Literal ; - sh:order 7 ; - sh:path ; - sh:pattern "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$" ], - [ sh:datatype xsd:string ; - sh:description "ORCID of the author, a type of unique identifier" ; + sh:description "Country of the author's institution" ; sh:maxCount 1 ; sh:minCount 1 ; - sh:name "ORCID" ; + sh:name "Country" ; sh:nodeKind sh:Literal ; - sh:order 1 ; - sh:path ], + sh:order 2 ; + sh:path ], [ sh:datatype xsd:string ; sh:description "Role of the author, i.e., principal investigator" ; sh:maxCount 1 ; @@ -553,19 +563,20 @@ sh:order 4 ; sh:path ], [ sh:datatype xsd:string ; - sh:description "Country of the author's institution" ; + sh:description "email" ; sh:maxCount 1 ; sh:minCount 1 ; - sh:name "Country" ; sh:nodeKind sh:Literal ; - sh:order 2 ; - sh:path ], - [ sh:class ; - sh:description "institution" ; + sh:order 7 ; + sh:path ; + sh:pattern "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$" ], + [ sh:datatype xsd:string ; + sh:description "work phone" ; + sh:maxCount 1 ; sh:minCount 1 ; - sh:nodeKind sh:BlankNodeOrIRI ; - sh:order 0 ; - sh:path ] ; + sh:nodeKind sh:Literal ; + sh:order 8 ; + sh:path ] ; sh:targetClass . a sh:NodeShape ; @@ -573,20 +584,20 @@ sh:description "A class representing an organization" ; sh:ignoredProperties ( rdf:type ) ; sh:name "Organization" ; - sh:property [ sh:description "Type of organization, academic, commercial, governmental, etc." ; - sh:in ( "Academic" "Commercial" "Government" "Other" ) ; - sh:maxCount 1 ; - sh:minCount 1 ; - sh:name "Type_org" ; - sh:order 1 ; - sh:path ], - [ sh:datatype xsd:string ; + sh:property [ sh:datatype xsd:string ; sh:description "Name of the organization" ; sh:maxCount 1 ; sh:name "Name_org" ; sh:nodeKind sh:Literal ; sh:order 0 ; - sh:path ] ; + sh:path ], + [ sh:description "Type of organization, academic, commercial, governmental, etc." ; + sh:in ( "Academic" "Commercial" "Government" "Other" ) ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:name "Type_org" ; + sh:order 1 ; + sh:path ] ; sh:targetClass . a sh:NodeShape ; @@ -594,55 +605,55 @@ sh:description "A class representing a grid" ; sh:ignoredProperties ( rdf:type ) ; sh:name "Grid" ; - sh:property [ sh:datatype xsd:string ; - sh:description "Type of material the support film is made of" ; + sh:property [ sh:datatype xsd:float ; + sh:description "Pressure of the chamber during pretreatment, in Pa" ; sh:maxCount 1 ; - sh:name "Film_material" ; + sh:name "Pretreatment_pressure" ; sh:nodeKind sh:Literal ; - sh:order 4 ; - sh:path ], + sh:order 9 ; + sh:path ], [ sh:datatype xsd:string ; - sh:description "Thickness of the support film" ; + sh:description "Topology of the support film" ; sh:maxCount 1 ; - sh:name "Film_thickness" ; + sh:name "Film_topology" ; sh:nodeKind sh:Literal ; - sh:order 6 ; - sh:path ], - [ sh:datatype xsd:string ; - sh:description "Type of pretreatment of the grid, i.e., glow discharge" ; + sh:order 5 ; + sh:path ], + [ sh:datatype xsd:float ; + sh:description "Grid mesh in lines per inch" ; sh:maxCount 1 ; - sh:name "Pretreatment_type" ; + sh:name "Mesh" ; sh:nodeKind sh:Literal ; - sh:order 7 ; - sh:path ], + sh:order 2 ; + sh:path ], [ sh:datatype xsd:boolean ; sh:description "Whether a support film was used" ; sh:maxCount 1 ; sh:name "Film_support" ; sh:nodeKind sh:Literal ; sh:order 3 ; - sh:path ], - [ sh:datatype xsd:float ; - sh:description "Length of time of the pretreatment in s" ; + sh:path ], + [ sh:datatype xsd:string ; + sh:description "Type of material the support film is made of" ; sh:maxCount 1 ; - sh:name "Pretreatment_time" ; + sh:name "Film_material" ; sh:nodeKind sh:Literal ; - sh:order 8 ; - sh:path ], + sh:order 4 ; + sh:path ], [ sh:datatype xsd:string ; - sh:description "Atmospheric conditions in the chamber during pretreatment, i.e., addition of specific gases, etc." ; + sh:description "Thickness of the support film" ; sh:maxCount 1 ; - sh:name "Pretreatment_atmosphere" ; + sh:name "Film_thickness" ; sh:nodeKind sh:Literal ; - sh:order 10 ; - sh:path ], + sh:order 6 ; + sh:path ], [ sh:datatype xsd:string ; - sh:description "Topology of the support film" ; + sh:description "Grid manufacturer" ; sh:maxCount 1 ; - sh:name "Film_topology" ; + sh:name "Manufacturer" ; sh:nodeKind sh:Literal ; - sh:order 5 ; - sh:path ], + sh:order 0 ; + sh:path ], [ sh:datatype xsd:string ; sh:description "Material out of which the grid is made" ; sh:maxCount 1 ; @@ -650,27 +661,27 @@ sh:nodeKind sh:Literal ; sh:order 1 ; sh:path ], - [ sh:datatype xsd:float ; - sh:description "Pressure of the chamber during pretreatment, in Pa" ; + [ sh:datatype xsd:string ; + sh:description "Type of pretreatment of the grid, i.e., glow discharge" ; sh:maxCount 1 ; - sh:name "Pretreatment_pressure" ; + sh:name "Pretreatment_type" ; sh:nodeKind sh:Literal ; - sh:order 9 ; - sh:path ], + sh:order 7 ; + sh:path ], [ sh:datatype xsd:float ; - sh:description "Grid mesh in lines per inch" ; + sh:description "Length of time of the pretreatment in s" ; sh:maxCount 1 ; - sh:name "Mesh" ; + sh:name "Pretreatment_time" ; sh:nodeKind sh:Literal ; - sh:order 2 ; - sh:path ], + sh:order 8 ; + sh:path ], [ sh:datatype xsd:string ; - sh:description "Grid manufacturer" ; + sh:description "Atmospheric conditions in the chamber during pretreatment, i.e., addition of specific gases, etc." ; sh:maxCount 1 ; - sh:name "Manufacturer" ; + sh:name "Pretreatment_atmosphere" ; sh:nodeKind sh:Literal ; - sh:order 0 ; - sh:path ] ; + sh:order 10 ; + sh:path ] ; sh:targetClass . a sh:NodeShape ; @@ -707,22 +718,21 @@ sh:description "A class representing a molecule" ; sh:ignoredProperties ( rdf:type ) ; sh:name "Molecule" ; - sh:property [ sh:datatype xsd:string ; - sh:description "Description of the overall supramolecular type, i.e., a complex" ; + sh:property [ sh:description "Class of the molecule" ; + sh:in ( "Antibiotic" "Carbohydrate" "Chimera" "None of these" ) ; sh:maxCount 1 ; sh:minCount 1 ; - sh:name "Type" ; - sh:nodeKind sh:Literal ; - sh:order 1 ; - sh:path ], + sh:name "Class" ; + sh:order 2 ; + sh:path ], [ sh:datatype xsd:string ; - sh:description "Taxonomy ID of the expression system organism" ; + sh:description "Full sequence of the sample as in the data, i.e., cleaved tags should also be removed from sequence here" ; sh:maxCount 1 ; sh:minCount 1 ; - sh:name "Taxonomy_ID_expression" ; + sh:name "Sequence" ; sh:nodeKind sh:Literal ; - sh:order 7 ; - sh:path ], + sh:order 3 ; + sh:path ], [ sh:datatype xsd:string ; sh:description "Name of the gene of interest" ; sh:maxCount 1 ; @@ -731,36 +741,37 @@ sh:order 8 ; sh:path ], [ sh:datatype xsd:string ; - sh:description "Taxonomy ID of the natural source organism" ; + sh:description "Name of an individual molecule (often protein) in the sample" ; sh:maxCount 1 ; sh:minCount 1 ; - sh:name "Taxonomy_ID_source" ; + sh:name "Name" ; sh:nodeKind sh:Literal ; - sh:order 5 ; - sh:path ], - [ sh:description "Class of the molecule" ; - sh:in ( "Antibiotic" "Carbohydrate" "Chimera" "None of these" ) ; + sh:order 0 ; + sh:path ], + [ sh:datatype xsd:string ; + sh:description "Taxonomy ID of the expression system organism" ; sh:maxCount 1 ; sh:minCount 1 ; - sh:name "Class" ; - sh:order 2 ; - sh:path ], + sh:name "Taxonomy_ID_expression" ; + sh:nodeKind sh:Literal ; + sh:order 7 ; + sh:path ], [ sh:datatype xsd:string ; - sh:description "Full sequence of the sample as in the data, i.e., cleaved tags should also be removed from sequence here" ; + sh:description "Description of the overall supramolecular type, i.e., a complex" ; sh:maxCount 1 ; sh:minCount 1 ; - sh:name "Sequence" ; + sh:name "Type" ; sh:nodeKind sh:Literal ; - sh:order 3 ; - sh:path ], + sh:order 1 ; + sh:path ], [ sh:datatype xsd:string ; - sh:description "Name of an individual molecule (often protein) in the sample" ; + sh:description "Scientific name of the organism used to produce the molecule of interest" ; sh:maxCount 1 ; sh:minCount 1 ; - sh:name "Name" ; + sh:name "Expression_system" ; sh:nodeKind sh:Literal ; - sh:order 0 ; - sh:path ], + sh:order 6 ; + sh:path ], [ sh:datatype xsd:string ; sh:description "Scientific name of the natural host organism" ; sh:maxCount 1 ; @@ -770,13 +781,13 @@ sh:order 4 ; sh:path ], [ sh:datatype xsd:string ; - sh:description "Scientific name of the organism used to produce the molecule of interest" ; + sh:description "Taxonomy ID of the natural source organism" ; sh:maxCount 1 ; sh:minCount 1 ; - sh:name "Expression_system" ; + sh:name "Taxonomy_ID_source" ; sh:nodeKind sh:Literal ; - sh:order 6 ; - sh:path ] ; + sh:order 5 ; + sh:path ] ; sh:targetClass . a sh:NodeShape ; @@ -784,21 +795,21 @@ sh:description "A class representing the overall molecule" ; sh:ignoredProperties ( rdf:type ) ; sh:name "OverallMolecule" ; - sh:property [ sh:datatype xsd:string ; - sh:description "Where the sample was taken from, i.e., natural host, recombinantly expressed, etc." ; - sh:maxCount 1 ; - sh:minCount 1 ; - sh:name "Source" ; - sh:nodeKind sh:Literal ; - sh:order 2 ; - sh:path ], - [ sh:datatype xsd:float ; + sh:property [ sh:datatype xsd:float ; sh:description "Molecular weight in Da" ; sh:maxCount 1 ; sh:name "Molecular_weight" ; sh:nodeKind sh:Literal ; sh:order 3 ; sh:path ], + [ sh:datatype xsd:string ; + sh:description "Description of the overall supramolecular type, i.e., a complex" ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:name "Type" ; + sh:nodeKind sh:Literal ; + sh:order 0 ; + sh:path ], [ sh:datatype xsd:string ; sh:description "Name of the full sample" ; sh:maxCount 1 ; @@ -808,13 +819,13 @@ sh:order 1 ; sh:path ], [ sh:datatype xsd:string ; - sh:description "Description of the overall supramolecular type, i.e., a complex" ; + sh:description "Where the sample was taken from, i.e., natural host, recombinantly expressed, etc." ; sh:maxCount 1 ; sh:minCount 1 ; - sh:name "Type" ; + sh:name "Source" ; sh:nodeKind sh:Literal ; - sh:order 0 ; - sh:path ] ; + sh:order 2 ; + sh:path ] ; sh:targetClass . a sh:NodeShape ; @@ -822,14 +833,7 @@ sh:description "A class representing a sample" ; sh:ignoredProperties ( rdf:type ) ; sh:name "Sample" ; - sh:property [ sh:class ; - sh:description "Description of the grid used" ; - sh:maxCount 1 ; - sh:name "Grid" ; - sh:nodeKind sh:BlankNodeOrIRI ; - sh:order 4 ; - sh:path ], - [ sh:class ; + sh:property [ sh:class ; sh:description "Description of the specimen" ; sh:maxCount 1 ; sh:minCount 1 ; @@ -837,6 +841,21 @@ sh:nodeKind sh:BlankNodeOrIRI ; sh:order 3 ; sh:path ], + [ sh:class ; + sh:description "Description of the overall molecule" ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:name "Overall_Molecule" ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:order 0 ; + sh:path ], + [ sh:class ; + sh:description "Description of the grid used" ; + sh:maxCount 1 ; + sh:name "Grid" ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:order 4 ; + sh:path ], [ sh:class ; sh:description "List of ligands associated with the sample" ; sh:name "Ligands" ; @@ -849,15 +868,7 @@ sh:name "Molecule" ; sh:nodeKind sh:BlankNodeOrIRI ; sh:order 1 ; - sh:path ], - [ sh:class ; - sh:description "Description of the overall molecule" ; - sh:maxCount 1 ; - sh:minCount 1 ; - sh:name "Overall_Molecule" ; - sh:nodeKind sh:BlankNodeOrIRI ; - sh:order 0 ; - sh:path ] ; + sh:path ] ; sh:targetClass . a sh:NodeShape ; @@ -866,21 +877,13 @@ sh:ignoredProperties ( rdf:type ) ; sh:name "Specimen" ; sh:property [ sh:datatype xsd:boolean ; - sh:description "Whether the sample was shadowed" ; - sh:maxCount 1 ; - sh:minCount 1 ; - sh:name "Shadowing" ; - sh:nodeKind sh:Literal ; - sh:order 9 ; - sh:path ], - [ sh:datatype xsd:boolean ; - sh:description "Whether the sample was vitrified" ; + sh:description "Whether the sample was stained" ; sh:maxCount 1 ; sh:minCount 1 ; - sh:name "Vitrification" ; + sh:name "Staining" ; sh:nodeKind sh:Literal ; - sh:order 3 ; - sh:path ], + sh:order 7 ; + sh:path ], [ sh:datatype xsd:float ; sh:description "Environmental temperature just before vitrification, in K" ; sh:maxCount 1 ; @@ -889,29 +892,21 @@ sh:nodeKind sh:Literal ; sh:order 6 ; sh:path ], - [ sh:datatype xsd:string ; - sh:description "Which cryogen was used for vitrification" ; - sh:maxCount 1 ; - sh:minCount 1 ; - sh:name "Vitrification_cryogen" ; - sh:nodeKind sh:Literal ; - sh:order 4 ; - sh:path ], [ sh:datatype xsd:float ; - sh:description "pH of the sample buffer" ; + sh:description "Concentration of the (supra)molecule in the sample, in M" ; sh:maxCount 1 ; - sh:minCount 1 ; - sh:name "pH" ; + sh:name "Concentration" ; sh:nodeKind sh:Literal ; - sh:order 2 ; - sh:path ], - [ sh:datatype xsd:float ; - sh:description "Environmental humidity just before vitrification, in %" ; + sh:order 1 ; + sh:path ], + [ sh:datatype xsd:boolean ; + sh:description "Whether the sample was vitrified" ; sh:maxCount 1 ; - sh:name "Humidity" ; + sh:minCount 1 ; + sh:name "Vitrification" ; sh:nodeKind sh:Literal ; - sh:order 5 ; - sh:path ], + sh:order 3 ; + sh:path ], [ sh:datatype xsd:boolean ; sh:description "Whether the sample was embedded" ; sh:maxCount 1 ; @@ -920,14 +915,22 @@ sh:nodeKind sh:Literal ; sh:order 8 ; sh:path ], + [ sh:datatype xsd:string ; + sh:description "Which cryogen was used for vitrification" ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:name "Vitrification_cryogen" ; + sh:nodeKind sh:Literal ; + sh:order 4 ; + sh:path ], [ sh:datatype xsd:boolean ; - sh:description "Whether the sample was stained" ; + sh:description "Whether the sample was shadowed" ; sh:maxCount 1 ; sh:minCount 1 ; - sh:name "Staining" ; + sh:name "Shadowing" ; sh:nodeKind sh:Literal ; - sh:order 7 ; - sh:path ], + sh:order 9 ; + sh:path ], [ sh:datatype xsd:string ; sh:description "Name/composition of the (chemical) sample buffer during grid preparation" ; sh:maxCount 1 ; @@ -936,12 +939,20 @@ sh:order 0 ; sh:path ], [ sh:datatype xsd:float ; - sh:description "Concentration of the (supra)molecule in the sample, in M" ; + sh:description "pH of the sample buffer" ; sh:maxCount 1 ; - sh:name "Concentration" ; + sh:minCount 1 ; + sh:name "pH" ; sh:nodeKind sh:Literal ; - sh:order 1 ; - sh:path ] ; + sh:order 2 ; + sh:path ], + [ sh:datatype xsd:float ; + sh:description "Environmental humidity just before vitrification, in %" ; + sh:maxCount 1 ; + sh:name "Humidity" ; + sh:nodeKind sh:Literal ; + sh:order 5 ; + sh:path ] ; sh:targetClass . a sh:NodeShape ; @@ -968,6 +979,12 @@ sh:description "A series of numbers constructed from min, max, and increment" ; sh:ignoredProperties ( rdf:type ) ; sh:property [ sh:datatype xsd:float ; + sh:description "Minimal value of a given dataset property" ; + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:order 1 ; + sh:path ], + [ sh:datatype xsd:float ; sh:description "Maximal value of a given dataset property" ; sh:maxCount 1 ; sh:nodeKind sh:Literal ; @@ -978,13 +995,7 @@ sh:maxCount 1 ; sh:nodeKind sh:Literal ; sh:order 0 ; - sh:path ], - [ sh:datatype xsd:float ; - sh:description "Minimal value of a given dataset property" ; - sh:maxCount 1 ; - sh:nodeKind sh:Literal ; - sh:order 1 ; - sh:path ] ; + sh:path ] ; sh:targetClass . a sh:NodeShape ; @@ -1004,17 +1015,17 @@ sh:order 2 ; sh:path ], [ sh:datatype xsd:float ; - sh:description "minimum x" ; + sh:description "maximum x" ; sh:maxCount 1 ; sh:nodeKind sh:Literal ; - sh:order 0 ; - sh:path ], + sh:order 1 ; + sh:path ], [ sh:datatype xsd:float ; - sh:description "maximum x" ; + sh:description "minimum x" ; sh:maxCount 1 ; sh:nodeKind sh:Literal ; - sh:order 1 ; - sh:path ] ; + sh:order 0 ; + sh:path ] ; sh:targetClass . a sh:NodeShape ; @@ -1022,16 +1033,16 @@ sh:description "A range constructed from min and max" ; sh:ignoredProperties ( rdf:type ) ; sh:property [ sh:datatype xsd:float ; - sh:description "Minimal value of a given dataset property" ; + sh:description "Maximal value of a given dataset property" ; sh:maxCount 1 ; sh:nodeKind sh:Literal ; - sh:order 0 ; - sh:path ], + sh:order 1 ; + sh:path ], [ sh:datatype xsd:float ; - sh:description "Maximal value of a given dataset property" ; + sh:description "Minimal value of a given dataset property" ; sh:maxCount 1 ; sh:nodeKind sh:Literal ; - sh:order 1 ; - sh:path ] ; + sh:order 0 ; + sh:path ] ; sh:targetClass . diff --git a/project/shex/oscem_schemas.shex b/project/shex/oscem_schemas.shex index 8bdb82a..f5f1af5 100644 --- a/project/shex/oscem_schemas.shex +++ b/project/shex/oscem_schemas.shex @@ -59,7 +59,7 @@ linkml:Sparqlpath xsd:string @linkml:Float ; @ ? ; @ ? ; - @linkml:Datetime ; + @ ; @linkml:Float ? ; @linkml:String ? ; @linkml:Integer ? ; @@ -78,10 +78,16 @@ linkml:Sparqlpath xsd:string ) } + CLOSED { + ( $ rdf:type . * ; + rdf:type [ linkml:Any ] ? + ) +} + CLOSED { ( $ ( & ; rdf:type [ schema1:Person ] ? ; - schema1:Organization @ + ; + schema1:Organization @ ; @linkml:String ; @linkml:String ; @linkml:String ? ; @@ -106,7 +112,7 @@ linkml:Sparqlpath xsd:string CLOSED { ( $ ( @linkml:Boolean ; - @linkml:String + @linkml:String ) ; rdf:type [ ] ? ) @@ -206,7 +212,7 @@ linkml:Sparqlpath xsd:string CLOSED { ( $ ( @linkml:String ; - @linkml:String ; + @linkml:String ; [ @@ -223,7 +229,7 @@ linkml:Sparqlpath xsd:string } CLOSED { - ( $ ( @linkml:String ; + ( $ ( @linkml:String ; @linkml:String ; @linkml:String ; @linkml:Float ? @@ -247,7 +253,7 @@ linkml:Sparqlpath xsd:string CLOSED { ( $ ( @linkml:Boolean ; - @linkml:String + @linkml:String ) ; rdf:type [ ] ? ) @@ -326,7 +332,7 @@ linkml:Sparqlpath xsd:string CLOSED { ( $ ( @linkml:Boolean ; - @linkml:String + @linkml:String ) ; rdf:type [ ] ? ) diff --git a/project/sqlschema/oscem_schemas.sql b/project/sqlschema/oscem_schemas.sql index 4ddd00c..58cfa4e 100644 --- a/project/sqlschema/oscem_schemas.sql +++ b/project/sqlschema/oscem_schemas.sql @@ -8,6 +8,8 @@ -- * Slot: increment Description: Increment between elements of a series -- * Slot: minimal Description: Minimal value of a given dataset property -- * Slot: maximal Description: Maximal value of a given dataset property +-- # Class: "Any" Description: "Any type, used as the base for type-narrowing.See https://linkml.io/linkml/schemas/advanced.html" +-- * Slot: id Description: -- # Class: "Range" Description: "A range constructed from min and max" -- * Slot: id Description: -- * Slot: minimal Description: Minimal value of a given dataset property @@ -37,7 +39,6 @@ -- * Slot: detector Description: Make and model of the detector used -- * Slot: detector_mode Description: Operating mode of the detector -- * Slot: dose_per_movie Description: Average dose per image/movie/tilt - given in electrons per square Angstrom --- * Slot: datetime Description: Time and date of the data acquisition -- * Slot: exposure_time Description: Time of data acquisition per movie/tilt - in s -- * Slot: cryogen Description: Cryogen used in cooling the instrument and sample, usually nitrogen -- * Slot: frames_per_movie Description: Number of frames that on average constitute a full movie, can be a bit hard to define for some detectors @@ -52,6 +53,7 @@ -- * Slot: temperature_id Description: Temperature during data collection, in K with min and max values. -- * Slot: energy_filter_id Description: Wether an energy filter was used and its specifics. -- * Slot: image_size_id Description: The size of the image in pixels, height and width given. +-- * Slot: datetime_id Description: Time and date of the data acquisition -- * Slot: specialist_optics_id Description: Any type of special optics, such as a phaseplate -- * Slot: beamshift_id Description: Movement of the beam above the sample for data collection purposes that does not require movement of the stage. Given in mrad. -- * Slot: beamtilt_id Description: Another way to move the beam above the sample for data collection purposes that does not require movement of the stage. Given in mrad. @@ -69,15 +71,15 @@ -- # Class: "Phaseplate" Description: "" -- * Slot: id Description: -- * Slot: used Description: whether a specific instrument was used during data acquisition --- * Slot: type Description: Type of phaseplate +-- * Slot: instrument_type Description: Type of phaseplate -- # Class: "SphericalAberrationCorrector" Description: "" -- * Slot: id Description: -- * Slot: used Description: whether a specific instrument was used during data acquisition --- * Slot: type Description: Details of a given specialist instrument +-- * Slot: instrument_type Description: Details of a given specialist instrument -- # Class: "ChromaticAberrationCorrector" Description: "" -- * Slot: id Description: -- * Slot: used Description: whether a specific instrument was used during data acquisition --- * Slot: type Description: Details of a given specialist instrument +-- * Slot: instrument_type Description: Details of a given specialist instrument -- # Class: "Instrument" Description: "Instrument values, mostly constant across a data collection." -- * Slot: id Description: -- * Slot: microscope Description: Name/Type of the Microscope @@ -104,6 +106,7 @@ -- * Slot: work_status Description: work status -- * Slot: email Description: email -- * Slot: work_phone Description: work phone +-- * Slot: institution_id Description: author's institution -- # Class: "Institution" Description: "A class representing an organization" -- * Slot: id Description: -- * Slot: name_org Description: Name of the organization @@ -122,14 +125,14 @@ -- * Slot: has_unit Description: Unit -- # Class: "OverallMolecule" Description: "A class representing the overall molecule" -- * Slot: id Description: --- * Slot: type Description: Description of the overall supramolecular type, i.e., a complex +-- * Slot: molecular_type Description: Description of the overall supramolecular type, i.e., a complex -- * Slot: name_sample Description: Name of the full sample -- * Slot: source Description: Where the sample was taken from, i.e., natural host, recombinantly expressed, etc. -- * Slot: molecular_weight Description: Molecular weight in Da -- # Class: "Molecule" Description: "A class representing a molecule" -- * Slot: id Description: -- * Slot: name_mol Description: Name of an individual molecule (often protein) in the sample --- * Slot: type Description: Description of the overall supramolecular type, i.e., a complex +-- * Slot: molecular_type Description: Description of the overall supramolecular type, i.e., a complex -- * Slot: molecular_class Description: Class of the molecule -- * Slot: sequence Description: Full sequence of the sample as in the data, i.e., cleaved tags should also be removed from sequence here -- * Slot: natural_source Description: Scientific name of the natural host organism @@ -178,9 +181,6 @@ -- # Class: "EMDataset_authors" Description: "" -- * Slot: EMDataset_id Description: Autocreated FK slot -- * Slot: authors_id Description: List of authors associated with the project --- # Class: "Author_institution" Description: "" --- * Slot: Author_id Description: Autocreated FK slot --- * Slot: institution_id Description: institution -- # Class: "Sample_molecule" Description: "" -- * Slot: Sample_id Description: Autocreated FK slot -- * Slot: molecule_id Description: List of molecule associated with the sample @@ -195,6 +195,10 @@ CREATE TABLE "TiltAngle" ( maximal FLOAT, PRIMARY KEY (id) ); +CREATE TABLE "Any" ( + id INTEGER NOT NULL, + PRIMARY KEY (id) +); CREATE TABLE "Range" ( id INTEGER NOT NULL, minimal FLOAT, @@ -232,19 +236,19 @@ CREATE TABLE "EnergyFilter" ( CREATE TABLE "Phaseplate" ( id INTEGER NOT NULL, used BOOLEAN NOT NULL, - type TEXT NOT NULL, + instrument_type TEXT NOT NULL, PRIMARY KEY (id) ); CREATE TABLE "SphericalAberrationCorrector" ( id INTEGER NOT NULL, used BOOLEAN NOT NULL, - type TEXT NOT NULL, + instrument_type TEXT NOT NULL, PRIMARY KEY (id) ); CREATE TABLE "ChromaticAberrationCorrector" ( id INTEGER NOT NULL, used BOOLEAN NOT NULL, - type TEXT NOT NULL, + instrument_type TEXT NOT NULL, PRIMARY KEY (id) ); CREATE TABLE "Instrument" ( @@ -267,18 +271,6 @@ CREATE TABLE "Person" ( work_phone TEXT, PRIMARY KEY (id) ); -CREATE TABLE "Author" ( - id INTEGER NOT NULL, - orcid TEXT NOT NULL, - country TEXT NOT NULL, - role TEXT, - name TEXT NOT NULL, - first_name TEXT, - work_status BOOLEAN, - email TEXT NOT NULL, - work_phone TEXT NOT NULL, - PRIMARY KEY (id) -); CREATE TABLE "Institution" ( id INTEGER NOT NULL, name_org TEXT, @@ -293,7 +285,7 @@ CREATE TABLE "QuantityValue" ( ); CREATE TABLE "OverallMolecule" ( id INTEGER NOT NULL, - type TEXT NOT NULL, + molecular_type TEXT NOT NULL, name_sample TEXT NOT NULL, source TEXT NOT NULL, molecular_weight FLOAT, @@ -302,7 +294,7 @@ CREATE TABLE "OverallMolecule" ( CREATE TABLE "Molecule" ( id INTEGER NOT NULL, name_mol TEXT NOT NULL, - type TEXT NOT NULL, + molecular_type TEXT NOT NULL, molecular_class VARCHAR(13) NOT NULL, sequence TEXT NOT NULL, natural_source TEXT NOT NULL, @@ -358,6 +350,20 @@ CREATE TABLE "SpecialistOptics" ( FOREIGN KEY(spherical_aberration_corrector_id) REFERENCES "SphericalAberrationCorrector" (id), FOREIGN KEY(chromatic_aberration_corrector_id) REFERENCES "ChromaticAberrationCorrector" (id) ); +CREATE TABLE "Author" ( + id INTEGER NOT NULL, + orcid TEXT NOT NULL, + country TEXT NOT NULL, + role TEXT, + name TEXT NOT NULL, + first_name TEXT, + work_status BOOLEAN, + email TEXT NOT NULL, + work_phone TEXT NOT NULL, + institution_id INTEGER NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY(institution_id) REFERENCES "Institution" (id) +); CREATE TABLE "Grant" ( id INTEGER NOT NULL, name TEXT, @@ -379,13 +385,6 @@ CREATE TABLE "Sample" ( FOREIGN KEY(specimen_id) REFERENCES "Specimen" (id), FOREIGN KEY(grid_id) REFERENCES "Grid" (id) ); -CREATE TABLE "Author_institution" ( - "Author_id" INTEGER, - institution_id INTEGER NOT NULL, - PRIMARY KEY ("Author_id", institution_id), - FOREIGN KEY("Author_id") REFERENCES "Author" (id), - FOREIGN KEY(institution_id) REFERENCES "Institution" (id) -); CREATE TABLE "Acquisition" ( id INTEGER NOT NULL, nominal_magnification INTEGER, @@ -396,7 +395,6 @@ CREATE TABLE "Acquisition" ( detector TEXT NOT NULL, detector_mode TEXT, dose_per_movie FLOAT NOT NULL, - datetime DATETIME NOT NULL, exposure_time FLOAT, cryogen TEXT, frames_per_movie INTEGER, @@ -411,6 +409,7 @@ CREATE TABLE "Acquisition" ( temperature_id INTEGER, energy_filter_id INTEGER, image_size_id INTEGER, + datetime_id INTEGER NOT NULL, specialist_optics_id INTEGER, beamshift_id INTEGER, beamtilt_id INTEGER, @@ -421,6 +420,7 @@ CREATE TABLE "Acquisition" ( FOREIGN KEY(temperature_id) REFERENCES "Range" (id), FOREIGN KEY(energy_filter_id) REFERENCES "EnergyFilter" (id), FOREIGN KEY(image_size_id) REFERENCES "ImageSize" (id), + FOREIGN KEY(datetime_id) REFERENCES "Any" (id), FOREIGN KEY(specialist_optics_id) REFERENCES "SpecialistOptics" (id), FOREIGN KEY(beamshift_id) REFERENCES "BoundingBox2D" (id), FOREIGN KEY(beamtilt_id) REFERENCES "BoundingBox2D" (id), diff --git a/src/data/examples/EMDataset-001.yaml b/src/data/examples/EMDataset-001.yaml index 3cdd300..9263c77 100644 --- a/src/data/examples/EMDataset-001.yaml +++ b/src/data/examples/EMDataset-001.yaml @@ -6,7 +6,7 @@ instrument: imaging: Brightfield electron_source: FEG acceleration_voltage: 300 - c2_Aperture: 70 + c2_aperture: 70 cs: 2.7 acquisition: holder: testitest @@ -16,14 +16,14 @@ acquisition: datetime: "2024-01-01" binning_camera: 2 pixel_size: 1.2 -grant: - - grant_id: SNF321 - funding_agency: SNF - - grant_id: Fundingofsomekind - funding_agency: SNF -author: +grants: + - project_id: SNF321 + funder: SNF + - project_id: Fundingofsomekind + funder: SNF +authors: - name: Doe - first_name: John + first_name: John email: john.doe@gmail.com work_phone: "+4132112312" orcid: ORCID_123124151231 @@ -42,13 +42,13 @@ author: country: Switzerland sample: overall_molecule: - type: Complex + molecular_type: Complex name_sample: Ribosome source: yeast molecular_weight: 3000000 molecule: - name_mol: Ribosome_ - type: polypeptide + molecular_type: polypeptide molecular_class: None of these sequence: MMKNMMKYMMMYSYKEKSEKRRWMMKREMMKYLELLNMRMNKWVKRMMMSRKRLLSRMNRLEKKNHMNDYKLMSYNFNKNSMMMKSMLSKLMMNLLENVMNGVDLKSGKSKMSGGNMMMSKPVMKENLNTVNMLFYYFLPNNKSYKYFNRMNMYLNKHMKNYKKLVKLNKNYSKSSYLLQDKLMMSNMFNNMMFNRNNMKYMNNNVNNLMSSLNMNSNNKSLYLSLLNKTLNNNLSNLYSNNNINKSIINNTLVNMSMLNNNYNNNNTTFNINNNLFNLLNLLNNNYNNNNNYNNMMSNTNMLLNNYNNNNNNNNNNKCNMHSKMKLERKNMMLNYLLKNEMMNKNQMWMSKMENNKMNNINNNNNMLKMNKENDKTNMFGYMMSYMDMLLGNMMNKSKKSNDMKMMMSKYFGLKEVNMTGMNLKYEFNNTEMLLKLMRKGMSKRKRTLSRMFRFRLKNRMPLLNDKGMLKNKMSNNLLKNLALNNNILNVEYNIKNVLFNSINNNNINNNNNNNMYNDMKDYYNNMSLENKKDLSLNNELLYKNMVGWSLLLKGKVGARKGKNRSNRMLMTKGSFKNNNLYIYNIFDDNSNNNGYTKDRLRLNYMKNSNFISYMDKSTNNGKLGMTLKVNIL natural_source: yeast diff --git a/src/oscem_schemas/datamodel/oscem_schemas.py b/src/oscem_schemas/datamodel/oscem_schemas.py index 028fa83..34015a4 100644 --- a/src/oscem_schemas/datamodel/oscem_schemas.py +++ b/src/oscem_schemas/datamodel/oscem_schemas.py @@ -1,5 +1,5 @@ # Auto generated from oscem_schemas.yaml by pythongen.py version: 0.0.1 -# Generation date: 2024-08-22T23:22:34 +# Generation date: 2024-08-23T00:59:03 # Schema: oscem-schemas # # id: https://w3id.org/osc-em/oscem-schemas @@ -22,8 +22,8 @@ from linkml_runtime.utils.enumerations import EnumDefinitionImpl from rdflib import Namespace, URIRef from linkml_runtime.utils.curienamespace import CurieNamespace -from linkml_runtime.linkml_model.types import Boolean, Date, Datetime, Double, Float, Integer, String -from linkml_runtime.utils.metamodelcore import Bool, XSDDate, XSDDateTime +from linkml_runtime.linkml_model.types import Boolean, Date, Double, Float, Integer, String +from linkml_runtime.utils.metamodelcore import Bool, XSDDate metamodel_version = "1.7.0" version = None @@ -105,7 +105,7 @@ class Acquisition(YAMLRoot): detector: str = None dose_per_movie: float = None - datetime: Union[str, XSDDateTime] = None + datetime: Union[dict, "Any"] = None binning_camera: float = None pixel_size: float = None nominal_defocus: Optional[Union[dict, "Range"]] = None @@ -142,11 +142,6 @@ def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]): if not isinstance(self.dose_per_movie, float): self.dose_per_movie = float(self.dose_per_movie) - if self._is_empty(self.datetime): - self.MissingRequiredField("datetime") - if not isinstance(self.datetime, XSDDateTime): - self.datetime = XSDDateTime(self.datetime) - if self._is_empty(self.binning_camera): self.MissingRequiredField("binning_camera") if not isinstance(self.binning_camera, float): @@ -292,7 +287,7 @@ class Phaseplate(YAMLRoot): class_model_uri: ClassVar[URIRef] = URIRef("https://w3id.org/osc-em/oscem-schemas/Phaseplate") used: Union[bool, Bool] = None - type: str = None + instrument_type: str = None def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]): if self._is_empty(self.used): @@ -300,10 +295,10 @@ def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]): if not isinstance(self.used, Bool): self.used = Bool(self.used) - if self._is_empty(self.type): - self.MissingRequiredField("type") - if not isinstance(self.type, str): - self.type = str(self.type) + if self._is_empty(self.instrument_type): + self.MissingRequiredField("instrument_type") + if not isinstance(self.instrument_type, str): + self.instrument_type = str(self.instrument_type) super().__post_init__(**kwargs) @@ -318,7 +313,7 @@ class SphericalAberrationCorrector(YAMLRoot): class_model_uri: ClassVar[URIRef] = URIRef("https://w3id.org/osc-em/oscem-schemas/SphericalAberrationCorrector") used: Union[bool, Bool] = None - type: str = None + instrument_type: str = None def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]): if self._is_empty(self.used): @@ -326,10 +321,10 @@ def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]): if not isinstance(self.used, Bool): self.used = Bool(self.used) - if self._is_empty(self.type): - self.MissingRequiredField("type") - if not isinstance(self.type, str): - self.type = str(self.type) + if self._is_empty(self.instrument_type): + self.MissingRequiredField("instrument_type") + if not isinstance(self.instrument_type, str): + self.instrument_type = str(self.instrument_type) super().__post_init__(**kwargs) @@ -344,7 +339,7 @@ class ChromaticAberrationCorrector(YAMLRoot): class_model_uri: ClassVar[URIRef] = URIRef("https://w3id.org/osc-em/oscem-schemas/ChromaticAberrationCorrector") used: Union[bool, Bool] = None - type: str = None + instrument_type: str = None def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]): if self._is_empty(self.used): @@ -352,10 +347,10 @@ def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]): if not isinstance(self.used, Bool): self.used = Bool(self.used) - if self._is_empty(self.type): - self.MissingRequiredField("type") - if not isinstance(self.type, str): - self.type = str(self.type) + if self._is_empty(self.instrument_type): + self.MissingRequiredField("instrument_type") + if not isinstance(self.instrument_type, str): + self.instrument_type = str(self.instrument_type) super().__post_init__(**kwargs) @@ -460,7 +455,7 @@ class Author(Person): class_name: ClassVar[str] = "Author" class_model_uri: ClassVar[URIRef] = URIRef("https://w3id.org/osc-em/oscem-schemas/Author") - institution: Union[Union[dict, "Institution"], List[Union[dict, "Institution"]]] = None + institution: Union[dict, "Institution"] = None orcid: str = None country: str = None name: str = None @@ -471,7 +466,8 @@ class Author(Person): def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]): if self._is_empty(self.institution): self.MissingRequiredField("institution") - self._normalize_inlined_as_dict(slot_name="institution", slot_type=Institution, key_name="type_org", keyed=False) + if not isinstance(self.institution, Institution): + self.institution = Institution(**as_dict(self.institution)) if self._is_empty(self.orcid): self.MissingRequiredField("orcid") @@ -609,16 +605,16 @@ class OverallMolecule(YAMLRoot): class_name: ClassVar[str] = "OverallMolecule" class_model_uri: ClassVar[URIRef] = URIRef("https://w3id.org/osc-em/oscem-schemas/OverallMolecule") - type: str = None + molecular_type: str = None name_sample: str = None source: str = None molecular_weight: Optional[float] = None def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]): - if self._is_empty(self.type): - self.MissingRequiredField("type") - if not isinstance(self.type, str): - self.type = str(self.type) + if self._is_empty(self.molecular_type): + self.MissingRequiredField("molecular_type") + if not isinstance(self.molecular_type, str): + self.molecular_type = str(self.molecular_type) if self._is_empty(self.name_sample): self.MissingRequiredField("name_sample") @@ -649,7 +645,7 @@ class Molecule(YAMLRoot): class_model_uri: ClassVar[URIRef] = URIRef("https://w3id.org/osc-em/oscem-schemas/Molecule") name_mol: str = None - type: str = None + molecular_type: str = None molecular_class: Union[str, "MoleculeClassEnum"] = None sequence: str = None natural_source: str = None @@ -664,10 +660,10 @@ def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]): if not isinstance(self.name_mol, str): self.name_mol = str(self.name_mol) - if self._is_empty(self.type): - self.MissingRequiredField("type") - if not isinstance(self.type, str): - self.type = str(self.type) + if self._is_empty(self.molecular_type): + self.MissingRequiredField("molecular_type") + if not isinstance(self.molecular_type, str): + self.molecular_type = str(self.molecular_type) if self._is_empty(self.molecular_class): self.MissingRequiredField("molecular_class") @@ -907,6 +903,8 @@ def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]): super().__post_init__(**kwargs) +Any = Any + @dataclass(repr=False) class Range(YAMLRoot): """ @@ -1131,7 +1129,7 @@ class slots: model_uri=DEFAULT_.image_size, domain=None, range=Optional[Union[dict, ImageSize]]) slots.datetime = Slot(uri=ACQUISITION.datetime, name="datetime", curie=ACQUISITION.curie('datetime'), - model_uri=DEFAULT_.datetime, domain=None, range=Optional[Union[str, XSDDateTime]]) + model_uri=DEFAULT_.datetime, domain=None, range=Optional[Union[dict, Any]]) slots.exposure_time = Slot(uri=ACQUISITION.exposure_time, name="exposure_time", curie=ACQUISITION.curie('exposure_time'), model_uri=DEFAULT_.exposure_time, domain=None, range=Optional[float]) @@ -1160,7 +1158,7 @@ class slots: slots.phaseplate = Slot(uri=ACQUISITION.phaseplate, name="phaseplate", curie=ACQUISITION.curie('phaseplate'), model_uri=DEFAULT_.phaseplate, domain=None, range=Optional[Union[dict, Phaseplate]]) -slots.instrument_type = Slot(uri=ACQUISITION.type, name="instrument_type", curie=ACQUISITION.curie('type'), +slots.instrument_type = Slot(uri=ACQUISITION.instrument_type, name="instrument_type", curie=ACQUISITION.curie('instrument_type'), model_uri=DEFAULT_.instrument_type, domain=None, range=Optional[str]) slots.spherical_aberration_corrector = Slot(uri=ACQUISITION.spherical_aberration_corrector, name="spherical_aberration_corrector", curie=ACQUISITION.curie('spherical_aberration_corrector'), @@ -1225,7 +1223,7 @@ class slots: model_uri=DEFAULT_.name, domain=None, range=Optional[str]) slots.institution = Slot(uri=SCHEMA.Organization, name="institution", curie=SCHEMA.curie('Organization'), - model_uri=DEFAULT_.institution, domain=None, range=Optional[Union[Union[dict, Institution], List[Union[dict, Institution]]]]) + model_uri=DEFAULT_.institution, domain=None, range=Optional[Union[dict, Institution]]) slots.name_org = Slot(uri="str(uriorcurie)", name="name_org", curie=None, model_uri=DEFAULT_.name_org, domain=None, range=Optional[str]) @@ -1263,7 +1261,7 @@ class slots: slots.project_id = Slot(uri=SCHEMA.identifier, name="project_id", curie=SCHEMA.curie('identifier'), model_uri=DEFAULT_.project_id, domain=None, range=Optional[str]) -slots.molecular_type = Slot(uri=SAMPLE['/type'], name="molecular_type", curie=SAMPLE.curie('/type'), +slots.molecular_type = Slot(uri=SAMPLE['/molecular_type'], name="molecular_type", curie=SAMPLE.curie('/molecular_type'), model_uri=DEFAULT_.molecular_type, domain=None, range=Optional[str]) slots.name_sample = Slot(uri=SAMPLE['/name_sample'], name="name_sample", curie=SAMPLE.curie('/name_sample'), @@ -1441,7 +1439,7 @@ class slots: model_uri=DEFAULT_.Acquisition_dose_per_movie, domain=Acquisition, range=float) slots.Acquisition_datetime = Slot(uri=ACQUISITION.datetime, name="Acquisition_datetime", curie=ACQUISITION.curie('datetime'), - model_uri=DEFAULT_.Acquisition_datetime, domain=Acquisition, range=Union[str, XSDDateTime]) + model_uri=DEFAULT_.Acquisition_datetime, domain=Acquisition, range=Union[dict, "Any"]) slots.Acquisition_binning_camera = Slot(uri=ACQUISITION.binning_camera, name="Acquisition_binning_camera", curie=ACQUISITION.curie('binning_camera'), model_uri=DEFAULT_.Acquisition_binning_camera, domain=Acquisition, range=float) @@ -1458,19 +1456,19 @@ class slots: slots.Phaseplate_used = Slot(uri=ACQUISITION.used, name="Phaseplate_used", curie=ACQUISITION.curie('used'), model_uri=DEFAULT_.Phaseplate_used, domain=Phaseplate, range=Union[bool, Bool]) -slots.Phaseplate_instrument_type = Slot(uri=ACQUISITION.type, name="Phaseplate_instrument_type", curie=ACQUISITION.curie('type'), +slots.Phaseplate_instrument_type = Slot(uri=ACQUISITION.instrument_type, name="Phaseplate_instrument_type", curie=ACQUISITION.curie('instrument_type'), model_uri=DEFAULT_.Phaseplate_instrument_type, domain=Phaseplate, range=str) slots.SphericalAberrationCorrector_used = Slot(uri=ACQUISITION.used, name="SphericalAberrationCorrector_used", curie=ACQUISITION.curie('used'), model_uri=DEFAULT_.SphericalAberrationCorrector_used, domain=SphericalAberrationCorrector, range=Union[bool, Bool]) -slots.SphericalAberrationCorrector_instrument_type = Slot(uri=ACQUISITION.type, name="SphericalAberrationCorrector_instrument_type", curie=ACQUISITION.curie('type'), +slots.SphericalAberrationCorrector_instrument_type = Slot(uri=ACQUISITION.instrument_type, name="SphericalAberrationCorrector_instrument_type", curie=ACQUISITION.curie('instrument_type'), model_uri=DEFAULT_.SphericalAberrationCorrector_instrument_type, domain=SphericalAberrationCorrector, range=str) slots.ChromaticAberrationCorrector_used = Slot(uri=ACQUISITION.used, name="ChromaticAberrationCorrector_used", curie=ACQUISITION.curie('used'), model_uri=DEFAULT_.ChromaticAberrationCorrector_used, domain=ChromaticAberrationCorrector, range=Union[bool, Bool]) -slots.ChromaticAberrationCorrector_instrument_type = Slot(uri=ACQUISITION.type, name="ChromaticAberrationCorrector_instrument_type", curie=ACQUISITION.curie('type'), +slots.ChromaticAberrationCorrector_instrument_type = Slot(uri=ACQUISITION.instrument_type, name="ChromaticAberrationCorrector_instrument_type", curie=ACQUISITION.curie('instrument_type'), model_uri=DEFAULT_.ChromaticAberrationCorrector_instrument_type, domain=ChromaticAberrationCorrector, range=str) slots.Instrument_microscope = Slot(uri="str(uriorcurie)", name="Instrument_microscope", curie=None, @@ -1505,7 +1503,7 @@ class slots: model_uri=DEFAULT_.Author_orcid, domain=Author, range=str) slots.Author_institution = Slot(uri=SCHEMA.Organization, name="Author_institution", curie=SCHEMA.curie('Organization'), - model_uri=DEFAULT_.Author_institution, domain=Author, range=Union[Union[dict, "Institution"], List[Union[dict, "Institution"]]]) + model_uri=DEFAULT_.Author_institution, domain=Author, range=Union[dict, "Institution"]) slots.Author_country = Slot(uri="str(uriorcurie)", name="Author_country", curie=None, model_uri=DEFAULT_.Author_country, domain=Author, range=str) @@ -1513,7 +1511,7 @@ class slots: slots.Institution_type_org = Slot(uri="str(uriorcurie)", name="Institution_type_org", curie=None, model_uri=DEFAULT_.Institution_type_org, domain=Institution, range=Union[str, "OrganizationTypeEnum"]) -slots.OverallMolecule_molecular_type = Slot(uri=SAMPLE['/type'], name="OverallMolecule_molecular_type", curie=SAMPLE.curie('/type'), +slots.OverallMolecule_molecular_type = Slot(uri=SAMPLE['/molecular_type'], name="OverallMolecule_molecular_type", curie=SAMPLE.curie('/molecular_type'), model_uri=DEFAULT_.OverallMolecule_molecular_type, domain=OverallMolecule, range=str) slots.OverallMolecule_name_sample = Slot(uri=SAMPLE['/name_sample'], name="OverallMolecule_name_sample", curie=SAMPLE.curie('/name_sample'), @@ -1528,7 +1526,7 @@ class slots: slots.Molecule_name_mol = Slot(uri=SAMPLE['/name_mol'], name="Molecule_name_mol", curie=SAMPLE.curie('/name_mol'), model_uri=DEFAULT_.Molecule_name_mol, domain=Molecule, range=str) -slots.Molecule_molecular_type = Slot(uri=SAMPLE['/type'], name="Molecule_molecular_type", curie=SAMPLE.curie('/type'), +slots.Molecule_molecular_type = Slot(uri=SAMPLE['/molecular_type'], name="Molecule_molecular_type", curie=SAMPLE.curie('/molecular_type'), model_uri=DEFAULT_.Molecule_molecular_type, domain=Molecule, range=str) slots.Molecule_molecular_class = Slot(uri=SAMPLE['/molecular_class'], name="Molecule_molecular_class", curie=SAMPLE.curie('/molecular_class'), diff --git a/src/oscem_schemas/schema/acquisition.yaml b/src/oscem_schemas/schema/acquisition.yaml index dfe50e5..912ea05 100644 --- a/src/oscem_schemas/schema/acquisition.yaml +++ b/src/oscem_schemas/schema/acquisition.yaml @@ -153,7 +153,11 @@ slots: description: The size of the image in pixels, height and width given. datetime: description: Time and date of the data acquisition - range: datetime + # range is required + range: Any + any_of: + - range: datetime + - range: date exposure_time: description: Time of data acquisition per movie/tilt - in s range: float @@ -182,7 +186,6 @@ slots: description: Phaseplate is a special optics device that can be used to enhance contrast range: Phaseplate instrument_type: - alias: type description: Details of a given specialist instrument range: string spherical_aberration_corrector: diff --git a/src/oscem_schemas/schema/organizational.yaml b/src/oscem_schemas/schema/organizational.yaml index c0274b3..b79855f 100644 --- a/src/oscem_schemas/schema/organizational.yaml +++ b/src/oscem_schemas/schema/organizational.yaml @@ -108,9 +108,8 @@ slots: slot_uri: schema:name institution: range: Institution - description: institution + description: author's institution slot_uri: schema:Organization - multivalued: true name_org: title: Name_org description: Name of the organization diff --git a/src/oscem_schemas/schema/sample.yaml b/src/oscem_schemas/schema/sample.yaml index e5d4aba..3bb67c6 100644 --- a/src/oscem_schemas/schema/sample.yaml +++ b/src/oscem_schemas/schema/sample.yaml @@ -203,7 +203,6 @@ classes: slots: molecular_type: - alias: type title: Type description: Description of the overall supramolecular type, i.e., a complex range: string diff --git a/src/oscem_schemas/schema/types.yaml b/src/oscem_schemas/schema/types.yaml index 895f113..2748729 100644 --- a/src/oscem_schemas/schema/types.yaml +++ b/src/oscem_schemas/schema/types.yaml @@ -6,6 +6,12 @@ imports: - linkml:types classes: + Any: + description: |- + Any type, used as the base for type-narrowing. + + See https://linkml.io/linkml/schemas/advanced.html + class_uri: linkml:Any Range: description: A range constructed from min and max slots: