import%20marimo%0A%0A__generated_with%20%3D%20%220.12.10%22%0Aapp%20%3D%20marimo.App(width%3D%22full%22%2C%20app_title%3D%22SHACL%20review%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20os%0A%20%20%20%20import%20json%0A%20%20%20%20import%20glob%20as%20glob_lib%0A%20%20%20%20from%20rdflib%20import%20Graph%2C%20URIRef%2C%20BNode%0A%20%20%20%20return%20BNode%2C%20Graph%2C%20URIRef%2C%20glob_lib%2C%20json%2C%20os%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20from%20epo_tools.widgets%20import%20pretty_query%0A%20%20%20%20from%20epo_tools.shacl%20import%20pretty_node%0A%20%20%20%20return%20pretty_node%2C%20pretty_query%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%20ePO%20SHACL%20v5.0.0-RC1%0A%0A%20%20%20%20%20%20%20%20%23%23%20Minimal%20Quality%20checks%0A%0A%20%20%20%20%20%20%20%20Corresponds%20to%20a%20list%20of%20scripts%20that%20check%20for%20regressions%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20shacl_files_pattern%20%3D%20mo.ui.text(%22assets%2Frelease%2F5.0.0%2Fimplementation%2F**%2Fshacl_shapes%2F*.ttl%22%2C%20full_width%3DTrue)%0A%20%20%20%20return%20(shacl_files_pattern%2C)%0A%0A%0A%40app.cell%0Adef%20_(glob_lib%2C%20mo%2C%20shacl_files_pattern)%3A%0A%20%20%20%20shacl_files%20%3D%20glob_lib.glob(shacl_files_pattern.value%2C%20recursive%3DTrue)%0A%20%20%20%20table%20%3D%20mo.ui.table(%0A%20%20%20%20%20%20%20%20data%3Dshacl_files%2C%20%0A%20%20%20%20%20%20%20%20pagination%3DTrue%2C%20%0A%20%20%20%20)%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20shacl_files_pattern%2C%0A%20%20%20%20%20%20%20%20table%0A%20%20%20%20%5D)%0A%20%20%20%20return%20shacl_files%2C%20table%0A%0A%0A%40app.cell%0Adef%20_(table)%3A%0A%20%20%20%20table.value%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Graph%2C%20table)%3A%0A%20%20%20%20g%20%3D%20Graph()%0A%0A%20%20%20%20for%20path%20in%20table.value%3A%0A%20%20%20%20%20%20%20%20g.parse(path%2C%20format%3D%22turtle%22)%0A%20%20%20%20return%20g%2C%20path%0A%0A%0A%40app.cell%0Adef%20_(g%2C%20pretty_query)%3A%0A%20%20%20%20pretty_query(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20%22%22%22%23%23%20Missing%20sh%3AnodeKind%20sh%3AIRI%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20Some%20sh%3AnodeKind%20sh%3AIRI%20are%20missing%20in%20properties%20that%20point%20to%20a%20class%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22query%22%3A%20%22%22%22%0A%0A%20%20%20%20PREFIX%20sh%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2Fns%2Fshacl%23%3E%0A%20%20%20%20SELECT%20DISTINCT%20%3Fshape%0A%20%20%20%20WHERE%20%7B%0A%20%20%20%20%20%20%20%20%3Fshape%20a%20sh%3APropertyShape%20%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sh%3Aclass%20%3Fclass%20.%0A%20%20%20%20%20%20%20%20FILTER%20NOT%20EXISTS%20%7B%20%3Fshape%20sh%3AnodeKind%20sh%3AIRI%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%7D%2C%20graph%3Dg)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(g%2C%20pretty_query)%3A%0A%20%20%20%20pretty_query(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20%22%22%22%23%23%20Missing%20rdfs%3AisDefinedBy%0A%0A%20%20%20%20%20%20%20%20Some%20SHACL%20properties%20miss%20%60rdfs%3AisDefinedBy%60%20to%20specify%20to%20their%20corresponding%20metadata%0A%0A%20%20%20%20%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22query%22%3A%20%22%22%22%0A%0A%20%20%20%20PREFIX%20sh%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2Fns%2Fshacl%23%3E%0A%20%20%20%20PREFIX%20rdfs%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2F2000%2F01%2Frdf-schema%23%3E%0A%20%20%20%20SELECT%20DISTINCT%20%3Fshape%0A%20%20%20%20WHERE%20%7B%0A%20%20%20%20%20%20%20%20%3Fshape%20a%20sh%3APropertyShape%20.%0A%20%20%20%20%20%20%20%20FILTER%20NOT%20EXISTS%20%7B%20%3Fshape%20rdfs%3AisDefinedBy%20%3Fdef%20%7D%0A%20%20%20%20%7D%0A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%7D%2C%20graph%3Dg)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(g%2C%20pretty_query)%3A%0A%20%20%20%20pretty_query(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20%22%22%22%23%23%20SHACL%20Node%20naming%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20This%20one%20is%20optional%2C%20but%20by%20convention%20Shapes%20are%20postfixed%20'Shape'%0A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22query%22%3A%20%22%22%22%0A%0A%20%20%20%20PREFIX%20sh%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2Fns%2Fshacl%23%3E%0A%20%20%20%20PREFIX%20rdfs%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2F2000%2F01%2Frdf-schema%23%3E%0A%0A%20%20%20%20SELECT%20DISTINCT%20%3Fshape%20%0A%20%20%20%20%20%20%20%20%20%20%20(STRAFTER(STR(%3Fshape)%2C%20%22%23%22)%20AS%20%3FshapeName)%0A%20%20%20%20%20%20%20%20%20%20%20(IF(STRENDS(%3FshapeName%2C%20%22Shape%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3FshapeName%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20CONCAT(%3FshapeName%2C%20%22Shape%22))%20AS%20%3FshapeProperName)%0A%20%20%20%20WHERE%20%7B%0A%20%20%20%20%20%20%20%20%3Fshape%20a%20sh%3ANodeShape%20.%0A%0A%20%20%20%20%20%20%20%20%23%20Filter%20out%20shapes%20that%20don't%20have%20a%20fragment%20identifier%20(%23)%0A%20%20%20%20%20%20%20%20FILTER(CONTAINS(STR(%3Fshape)%2C%20%22%23%22))%0A%0A%20%20%20%20%20%20%20%20%23%20Alternative%20if%20shapes%20use%20%2F%20instead%20of%20%23%0A%20%20%20%20%20%20%20%20%23%20BIND(STRAFTER(STR(%3Fshape)%2C%20%22%2F%22)%20AS%20%3FshapeName)%0A%20%20%20%20%7D%0A%20%20%20%20ORDER%20BY%20%3FshapeName%0A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%7D%2C%20graph%3Dg)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(g%2C%20pretty_query)%3A%0A%20%20%20%20pretty_query(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20%22%22%22%23%23%20SHACL%20property%20sh%3Aname%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20This%20one%20is%20optional%20(suggest%3A%20Initial%20capital%2C%20space-separated%2C%20subsequent%20words%20lowercase)%0A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22query%22%3A%20%22%22%22%0A%0A%20%20%20%20PREFIX%20sh%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2Fns%2Fshacl%23%3E%0A%20%20%20%20PREFIX%20fn%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2F2005%2Fxpath-functions%23%3E%0A%0A%20%20%20%20SELECT%20%3Fshape%20%3Fname%20(%0A%20%20%20%20%20%20%20%20CONCAT(%0A%20%20%20%20%20%20%20%20%20%20%20%20UCASE(SUBSTR(%3FtransformedName%2C%201%2C%201))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20SUBSTR(%3FtransformedName%2C%202)%0A%20%20%20%20%20%20%20%20)%20AS%20%3FproperName%0A%20%20%20%20)%0A%20%20%20%20WHERE%20%7B%0A%20%20%20%20%20%20%20%20%3Fshape%20a%20sh%3APropertyShape%20%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sh%3Aname%20%3Fname%20.%0A%0A%20%20%20%20%20%20%20%20%23%20Split%20CamelCase%20into%20spaces%0A%20%20%20%20%20%20%20%20BIND(REPLACE(%3Fname%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%22(%5Ba-z%5D)(%5BA-Z%5D)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%241%20%242%22%0A%20%20%20%20%20%20%20%20)%20AS%20%3FsplitCamel)%0A%0A%20%20%20%20%20%20%20%20%23%20Convert%20to%20lowercase%20and%20clean%20up%0A%20%20%20%20%20%20%20%20BIND(LCASE(%3FsplitCamel)%20AS%20%3FtransformedName)%0A%20%20%20%20%7D%0A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%7D%2C%20graph%3Dg)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20Inspection%20of%20Ranges%0A%0A%20%20%20%20%20%20%20%20The%20current%20property%20shapes%20do%20not%20specify%20what%20skos%3AConcept%20is%20expected.%20Is%20this%20by%20design%3F%0A%0A%20%20%20%20%20%20%20%20Below%203%20examples%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(g%2C%20pretty_node)%3A%0A%20%20%20%20pretty_node(%7B%0A%20%20%20%20%20%20%20%20%22message%22%3A%20%22It%20is%20not%20clear%20what%20is%20expected%20as%20range.%20Are%20these%20countries%20from%20a%20official%20vocabulary%3F%22%2C%0A%20%20%20%20%20%20%20%20%22uri%22%3A%20%22http%3A%2F%2Fdata.europa.eu%2Fa4g%2Fdata-shape%23epo-req-RequestForOffer-epo-hasDestinationCountryCode%22%0A%20%20%20%20%7D%2C%20g)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(g%2C%20pretty_node)%3A%0A%20%20%20%20pretty_node(%7B%0A%20%20%20%20%20%20%20%20%22message%22%3A%20%22It%20is%20not%20clear%20what%20is%20expected%20as%20range.%20Is%20it%20a%20Language%20from%20official%20vocabularies%3F%22%2C%0A%20%20%20%20%20%20%20%20%22uri%22%3A%20%22http%3A%2F%2Fdata.europa.eu%2Fa4g%2Fdata-shape%23epo-AccessTerm-epo-providesProcurementDocumentsInOfficialLanguage%22%0A%20%20%20%20%7D%2C%20g)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(g%2C%20pretty_node)%3A%0A%20%20%20%20pretty_node(%7B%0A%20%20%20%20%20%20%20%20%22message%22%3A%20%22Same%22%2C%0A%20%20%20%20%20%20%20%20%22uri%22%3A%20%22http%3A%2F%2Fdata.europa.eu%2Fa4g%2Fdata-shape%23epo-Document-epo-hasDocumentType%22%0A%20%20%20%20%7D%2C%20g)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%20Search%20utilities%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20search_term%20%3D%20mo.ui.text(%22ProcurementDocumentsInOfficialLanguage%22%2C%20full_width%3DTrue)%0A%20%20%20%20return%20(search_term%2C)%0A%0A%0A%40app.cell%0Adef%20_(g%2C%20mo%2C%20pretty_query%2C%20search_term)%3A%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20search_term%2C%0A%20%20%20%20pretty_query(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20%22%23%23%20Search%20URIs%20by%20name%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22query%22%3A%20f%22%22%22%0A%20%20%20%20SELECT%20DISTINCT%20%3Furi%0A%20%20%20%20WHERE%20%7B%7B%0A%20%20%20%20%20%20%3Furi%20%3Fp%20%3Fo%20.%0A%20%20%20%20%20%20FILTER(CONTAINS(STR(%3Furi)%2C%20%22%7Bsearch_term.value%7D%22))%0A%20%20%20%20%7D%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%7D%2C%20graph%3Dg)%0A%20%20%20%20%5D)%0A%0A%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
04d83473d9ccd5bf736330df186fc5d56f141faa65b9b2fb77f70533bed542e2