s3dgraphy 1.6.0.dev43__tar.gz → 1.6.0.dev45__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {s3dgraphy-1.6.0.dev43/src/s3dgraphy.egg-info → s3dgraphy-1.6.0.dev45}/PKG-INFO +1 -1
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/pyproject.toml +1 -1
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json +3 -3
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/s3Dgraphy_node_datamodel.json +12 -4
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/__init__.py +1 -1
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/api.py +64 -6
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/crdt.py +4 -2
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/emjson_exporter.py +18 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/graph.py +3 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/hdto.py +278 -10
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/importer/emjson_importer.py +56 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/importer/import_graphml.py +10 -0
- s3dgraphy-1.6.0.dev45/src/s3dgraphy/links.py +189 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/mappings/emdb/generic_specialfind_mapping.json +2 -2
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/mappings/emdb/site_properties_mapping.json +2 -2
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/mappings/emdb/usm_mapping.json +2 -2
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/mappings/generic/excel_to_graphml_mapping.json +2 -2
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/mappings/pyarchinit/pyarchinit_us_mapping.json +2 -2
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/mappings/source_list/em_sourcelist_it.json +2 -2
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/mappings/source_list/source_list_mapping.json +2 -2
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/mappings/template_emdb_mapping.json +2 -2
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/mappings/template_pyarchinit_mapping.json +2 -2
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/study.py +15 -5
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/graph_ingestor.py +7 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/graph_projector.py +345 -13
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/graphml_writer.py +98 -53
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45/src/s3dgraphy.egg-info}/PKG-INFO +1 -1
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy.egg-info/SOURCES.txt +3 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_dev29_graphml_without_a_database.py +5 -2
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_edge_outside_graph.py +4 -4
- s3dgraphy-1.6.0.dev45/tests/test_graph_header_code.py +114 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_hdto_study.py +100 -6
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_resource_file_node.py +2 -2
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_resource_revision.py +1 -1
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_spatiotemporal_entities.py +1 -1
- s3dgraphy-1.6.0.dev45/tests/test_stable_study_code.py +305 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/LICENSE +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/MANIFEST.in +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/README.md +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/setup.cfg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/acquisition_descriptor.schema.json +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/acquisition_mappings/ercolano.json +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/acquisition_mappings/fs.json +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/acquisition_mappings/uri.json +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/datamodel_translations.json +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/em.ttl +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/em_document_types.json +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/em_extractor_types.json +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/em_palette_icons.json +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/em_qualia_types.json +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/em_qualia_types_additions.json +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/em_state_symbols.json +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/em_visual_rules.json +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/hdto_extension.ttl +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/new_qualia_template.json +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/node_registry.generated.json +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/outdated_s3dgraphy.ttl +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/outdated_s3dgraphy_nomapping.ttl +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json.v155.bak +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/ActivityNodeGroup.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.png +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/EpochNode.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/ParadataNodeGroup.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/RSF.png +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/RSF.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/SE.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/SE_old.png +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/SE_old.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/SF.png +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/SF.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/TSU.png +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/US.png +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/US.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/USD.png +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/USD.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/USVn.png +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/USVn.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/USVs.png +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/USVs.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/UTR.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/VSF.png +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/VSF.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/author.png +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/author.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/author_ai.png +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/author_ai.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/combiner.png +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/combiner.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/container.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/continuity.png +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/continuity.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/document.png +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/document.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/00_transformation.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/01_topographicnetwork.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/02_pointcloud.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/03_mesh.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/04_points.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/05_lines.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/06_polygons.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/07_DEM.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/08_ortophoto.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/09_photos.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/10_laserscanner.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_computer.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_drone.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_gnss.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_optical.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_scanner.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_sensor.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_station.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/12_gnss_survey.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/13_field_drawing.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/14_recording_sheet.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/15_decimation.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/16_georeferencing.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/17_format_conversion.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/18_classification.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/dtc/19_vectorization.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/embargo.png +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/embargo.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/extractor.png +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/extractor.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/gcp_set.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/generic_node.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/geo_position.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/graph.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/license.png +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/license.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/link.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/narrative.png +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/narrative.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/play.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/property.png +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/property.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/proxy.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/registration_transform.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/representation_model.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/representation_model_doc.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/representation_model_sf.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/resource_file.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/semantic_shape.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/serSU.png +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/serSU.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/serUSD.png +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/serUSV.png +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/serUSVn.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/serUSVs.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/tileset.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/version_gltf.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/version_mesh.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/version_scene.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/2D/version_tiles.svg +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/3D/RSF.glb +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/3D/SF.glb +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/3D/TSU.glb +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/3D/US.glb +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/3D/USD.glb +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/3D/USVn.glb +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/3D/USVs.glb +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/3D/VSF.glb +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/3D/combiner.glb +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/3D/continuity.glb +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/3D/document.glb +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/3D/extractor.glb +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/3D/property.glb +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/3D/serSU.glb +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/3D/serUSD.glb +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/src/3D/serUSV.glb +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/JSON_config/version_for_cases.json +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/acquisition/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/acquisition/acquire.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/acquisition/descriptor.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/acquisition/mapping.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/ai_validation.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/annotation/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/annotation/migrate_reading.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/annotation/paradata.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/annotation/reading.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/authorities/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/authorities/resolver.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/authorities/snapshots/LICENSE +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/authorities/snapshots/chronontology.jsonld +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/authorities/snapshots/getty_aat.jsonld +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/authorities/snapshots/getty_tgn.jsonld +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/authorities/snapshots/periodo.jsonld +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/authorities/snapshots/provenance.json +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/classification.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/container.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/contract/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/contract/connector.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/contract/consumer.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/contract/core.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/contract/reference.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/data/StratiMiner_Extraction_Prompt.md +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/datamodel.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/diagnostics.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/dissemination.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/dtc/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/dtc/capture.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/dtc/corpus.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/dtc/devices.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/dtc/ingest.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/dtc/neighbourhood.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/dtc/residency.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/edges/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/edges/connection_resolver.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/edges/connections_loader.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/edges/edge.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/editorial.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/docx_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/graphml/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/graphml/canvas_generator.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/graphml/edge_generator.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/graphml/epoch_generator.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/graphml/graphml_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/graphml/graphml_patcher.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/graphml/group_node_generator.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/graphml/node_generator.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/graphml/node_registry.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/graphml/palette_resources.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/graphml/paradata_generator.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/graphml/paradata_image_generator.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/graphml/paradata_node_generators.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/graphml/table_node_generator.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/graphml/utils.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/html_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/ipynb_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/json_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/latex_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/rdf_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/exporter/unified_xlsx_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/geometry/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/geometry/aton.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/geometry/gltf.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/geometry/migrate.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/geometry/proxy.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/geometry/reading_glb.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/geometry/store_backed.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/geometry/wkt.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/iiif.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/importer/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/importer/base_importer.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/importer/csv_importer.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/importer/fmpxml_importer.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/importer/mapped_xlsx_importer.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/importer/metashape_project.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/importer/pyarchinit_importer.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/importer/qualia_importer.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/importer/rdf_importer.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/importer/sheet_header.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/importer/source_text.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/importer/unified_xlsx_importer.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/importer/xlsx_importer.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/importer/xml_importer.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/indices.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/labels.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/language.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/mappings/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/mappings/authoring.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/mappings/registry.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/merge/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/merge/graph_merger.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/multigraph/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/multigraph/multigraph.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/narrative/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/narrative/bake.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/narrative/generation.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/narrative/query.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/narrative/registry.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/narrative/site_story.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/annotation_region_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/author_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/base_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/combiner_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/document_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/dtc_acquisition_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/dtc_device_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/dtc_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/dtc_process_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/embargo_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/epoch_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/extractor_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/geo_position_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/georeferencing_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/graph_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/group_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/hdt_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/heritage_entity_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/license_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/narrative_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/paradata_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/project_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/property_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/representation_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/resource_file_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/resource_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/semantic_shape_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/stratigraphic_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/study_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/nodes/translation_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/ownership.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/paradata_view.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/photogrammetry/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/photogrammetry/delta.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/project_tree.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/property_source.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/publication.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/rapporti.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/resolvers/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/resolvers/builtin_rules.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/resolvers/property_resolver.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/resources/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/resources/addresses.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/resources/files.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/resources/fs_backend.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/resources/locate.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/resources/minio_backend.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/resources/resolver.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/resources/tiles3tz.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/resources/versions.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/rights.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/shelf/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/shelf/core.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/spatiotemporal.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/stamp/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/stamp/absorb.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/stamp/emit.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/stamp/hints.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/stamp/identity.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/_db_handle.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/_legacy_paradata_svgs.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/_workspace.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/conflict_resolver.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/edge_registry.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/group_projector.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/group_store.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/ingest_result.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/paradata_store.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/pyarchinit_pg_importer.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/rapporti.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/uuid7.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/vocab_provider_core.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/vocab_types.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/yed_classifier.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/yed_detector.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/yed_group_walker.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/yed_import_pipeline.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/yed_rapporti_policy.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/sync/yed_table_parser.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/templates/em_data_template.xlsx +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/templates/em_palette_template.graphml +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/temporal/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/temporal/inference_engine.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/tools/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/tools/consumer_drift.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/tools/datamodel_i18n.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/tools/deliverable_report.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/tools/glyph_sheet.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/tools/glyphs_from_svg.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/tools/node_finder.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/tools/sync_node_datamodel.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/tools/wheel_drift.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/transforms/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/transforms/aux_tracking.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/transforms/compact.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/transforms/materialize_continuity.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/translation.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/utils/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/utils/utils.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/utils/visual_layout.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy/zero_hour.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy.egg-info/dependency_links.txt +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy.egg-info/requires.txt +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/src/s3dgraphy.egg-info/top_level.txt +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_acquisition.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_acquisition_fs.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_add_resource.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_ai_validation_nodes.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_alternative_labels.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_api_surface.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_asset_dtc_protocol.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_asset_versions.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_aton_shapes.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_attach_only.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_authority_projection.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_authority_resolver.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_blend_locator.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_canonical_document_rename.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_canvas_metadata_import.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_capture_acquisition.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_capture_rdf_class.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_chronology_on_request.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_coating_unit.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_composite_node_name.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_connection_resolver.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_consumer_drift.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_container.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_container_layouts.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_containment_tpq.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_contract.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_contract_consumer.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_convert_command.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_crdt.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_cycle_message_is_cheap.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_datamodel_fingerprint.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_datamodel_i18n.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_deterministic_ids.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_dev29_em_sourcelist.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_dev29_file_set_stamp.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_dev29_image_set_texturing.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_dev29_not_georeferenced.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_dev29_one_act_n_outputs.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_dev29_ttl_round_trip.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_dev30_decisions.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_devices.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_dissemination_tombstones.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_dove_sta_il_testo.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_dtc_corpus.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_dtc_ingest.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_dtc_neighbourhood.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_dtc_projection.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_dtc_residency.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_edge_ui_phrases.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_editorial.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_em_ttl_matches_the_datamodels.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_emjson_no_drawing_keys.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_emjson_roundtrip.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_emjson_schema_version.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_epoch_properties_and_sub_epochs.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_epoch_undated_import.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_explicit_node_type_marker.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_extracted_from_unit.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_filtered_import.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_fmpxml_importer.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_fs_backend.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_functional_units.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_georeference_scene.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_gltf_stitch.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_glyph_paths.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_graph_helpers_indexed.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_graph_indices_alive.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_graph_indices_edges.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_graph_scope_migration.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_hdto_projection.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_header_key_aliases.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_i_generi_dei_passi.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_iiif.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_il_modo_d_accesso.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_il_modo_dal_relay.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_il_proprietario_si_legge.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_il_riallineamento.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_importer_edge_hygiene.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_ipynb_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_issue27_small_points.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_la_lingua_alla_nascita.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_la_lingua_dei_dati.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_la_lingua_nell_op.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_la_riga_d_intestazione.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_latex_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_le_traduzioni.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_lod_levels.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_lossless_roundtrip.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_mapping_authoring.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_mapping_csv_and_relations.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_masonry_unit.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_material_color.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_merge_conflicts.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_metashape_project.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_migrate_legacy_proxy.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_minio_backend.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_narrative_authorship.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_narrative_bake_docx.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_narrative_figures.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_narrative_generation.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_narrative_mentions.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_narrative_node.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_narrative_query.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_narrative_scaffolder.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_narrative_site_place.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_narrative_unvalidated_export.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_node_datamodel_registry.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_node_finder.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_node_type_map_integrity.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_one_resolver.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_one_spelling_writers.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_op_vocabulary.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_pg_importer.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_photogrammetry_delta.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_physical_relation_spellings.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_piu_indirizzi.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_promotion.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_property_as_source.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_property_owners.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_proxy_resource.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_proxy_retype.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_psx_locator.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_pyarchinit_tier2.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_qualia_dai_d7_d8.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_rdf_embedding.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_rdf_reverse_edges.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_rdf_roundtrip.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_reading_coords.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_reading_glb.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_reading_migration.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_reading_place.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_reading_rdf.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_recompute_warnings.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_release.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_reproject.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_resource_files_implicit.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_resource_layer.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_resource_representations.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_resource_tier.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_reverse_edges.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_rm_container_node_group.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_semantic_purity.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_shelf.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_shelf_facets.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_shelf_hatting.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_shelf_role_uri_table.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_shipped_mappings.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_source_list_mapping.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_source_text.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_stamp.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_stamp_hints.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_stamp_title_description.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_store_backed_geometry.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_stratiminer_api.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_study_metadata.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_tileset_resource.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_ttl_roundtrip.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_unit_definition.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_verifica_provenance.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_version_for.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_visual_assets.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_wheel_drift.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_xlsx_containment_and_unknown_bounds.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_xlsx_importer_graph_init.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_xlsx_source_column.py +0 -0
- {s3dgraphy-1.6.0.dev43 → s3dgraphy-1.6.0.dev45}/tests/test_zero_hour.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: s3dgraphy
|
|
3
|
-
Version: 1.6.0.
|
|
3
|
+
Version: 1.6.0.dev45
|
|
4
4
|
Summary: 3D Stratigraphic Graph Management Library for archaeological and heritage applications
|
|
5
5
|
Author-email: Emanuel Demetrescu <emanuel.demetrescu@cnr.it>
|
|
6
6
|
Maintainer-email: Emanuel Demetrescu <emanuel.demetrescu@cnr.it>
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "s3dgraphy"
|
|
7
|
-
version = "1.6.0.
|
|
7
|
+
version = "1.6.0.dev45"
|
|
8
8
|
description = "3D Stratigraphic Graph Management Library for archaeological and heritage applications"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.9"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"s3Dgraphy_connections_model_version": "1.6.
|
|
3
|
-
"description": "v1.6.38 (MICRO le entità spaziotemporali, decided by E.D. 2026-10-10: «Documenti, autori e unità stratigrafiche sono entità spaziotemporali e dovrebbero avere tutto il potenziale e la formalità delle US: start, end, posizione nel grafo matrix»): a DocumentNode and an AuthorNode (and so an AuthorAINode) take the temporal edges of a stratigraphic unit. has_property.source += AuthorNode — a person has a start and an end like a unit (absolute_time_start / absolute_time_end; for a person they read «date of birth» / «date of death», for a model «release» / «retirement», em_qualia_types 1.6.9 owner_names), and any other quale. has_first_epoch.source += AuthorNode (DocumentNode already had it, as a ParadataNode): the lane of the matrix where the entity begins, which is also where a client draws it. survive_in_epoch.source += DocumentNode, AuthorNode: a document that lasts (an inscription still read centuries later), an author active across two epochs of a study. is_after and has_same_time, source and target += DocumentNode, AuthorNode: the sequence of the matrix is the same order for the three — an excavation report is after the excavation, an engraving after the destruction it shows, a commentary after the text it reads; the chronology (Graph.chronology) dates documents and authors with the same rules as units (written, epoch, tpq/taq), CHRONOLOGY_TYPES += document, author, author_ai. is_in_activity.source += AuthorNode (an author's part in a campaign). WHAT IS NOT WIDENED, and why: the PHYSICAL relations (overlies, cuts, fills, abuts, is_bonded_to, is_physically_equal_to) stay between units only — a person does not cover a layer; changed_from and is_part_of stay stratigraphic (a temporal instance and a containment are statements about matter); is_in_timebranch waits for the branches. The RDF mappings are UNCHANGED: AP28/AP22 were already emitted on A8 units, which are persistent items like E31 and E21, so the three are read the same way; em:firstAttestedInEpoch and em:survivesInEpoch widen their domain to crm:E77_Persistent_Item in em.ttl 1.6.16. An instance is still a VIEW: em_visual_rules.paradata_instances gains `authorship`, so the author of a reading is drawn inside the group that reads, like a document (s3dgraphy.paradata_view). v1.6.37 (MICRO l'istanza è una vista, decided by E.D. 2026-10-09, evening: «non ha nessun senso fare un'istanza nel triple store: è solamente una modalità grafica di rappresentare il grafo»): the extractor that reads another unit's property points at the MASTER, the property in its own unit, as it points at a document; there is NO instance node in em.json nor in the RDF (the 1.6.36 data.instance_of is gone, and a property instance stored with it is folded onto its master when an em.json is read, s3dgraphy.property_source.fold_stored_instances). A client draws the master inside the reader's group as a VIEW, by the one rule for documents and properties in em_visual_rules.json → paradata_instances (s3dgraphy.paradata_view.view_instances). extracted_from.target keeps PropertyNode (_note_property and property_source_note rewritten: the target is the master); is_in_paradata_nodegroup.property_instance_note is gone (nothing to say: no instance joins a group). paradata_reasoning: property_instance becomes `instance` (a document or a property drawn in the group that reads it), the instance_badge placeholder becomes {owner} (a unit, or the epoch of a document), refresh_instance is gone. Nothing narrowed, no mapping changed. v1.6.36 (MICRO la proprietà come fonte, decided by E.D. 2026-10-09): extracted_from.target += PropertyNode — an extractor may read ANOTHER UNIT'S PROPERTY, through an INSTANCE of it in the reader's paradata group (a PropertyNode with data.instance_of = the master's id, data.instance_owner = the master's unit; s3dgraphy.property_source). The property becomes a source like a document: the upper parts of a temple take the material of the lower parts found, the trusses the wood of the fragments. is_in_paradata_nodegroup already admitted PropertyNode (measured): the instance joins the reader's group with no widening. NEW top-level block `paradata_reasoning`: the EM words of the reasoning between properties (the instance and its badge, the diagnostics source_changed / source_removed / reasoning_cycle / undeclared_owners, the cures), translated in datamodel_translations.json section `reasoning`. ADDITIVE: nothing narrowed, no mapping changed. v1.6.35 (dev27, 2026-10-31, decided by E.D. 2026-10-01, «il testo, la risorsa e la selezione»): was_revision_of admits TranslationNode on both ends — a translation realigned after its original changed is a new TranslationNode that was_revision_of the old one (s3dgraphy.translation.realign_translation). v1.6.34 (MICRO le traduzioni, 2026-10-29, decided by E.D. 2026-10-01): NEW has_translation / is_translation_of — any node → TranslationNode (node datamodel 1.6.20), crm:P73_has_translation, the CIDOC relation of a text to its translation. has_author.source += TranslationNode (who translated). extracted_from.source += TranslationNode: a translation taken from a published EDITION reaches the DocumentNode of that edition with the edge that already says «this text was taken from that source», instead of a second name for the same relation. v1.6.33 (MICRO la lingua dei dati, part H, 2026-10-27, decided by E.D. 2026-10-01): two em.ttl terms that had no edge now leave with the edge nearest to them. has_documentation gains extension_mapping em:derivedFromDocument, guarded by extension_when.source_node_class (DocumentaryStratigraphicUnit, SeriesOfDocumentaryStratigraphicUnit): a USD documented in a document is derived from it; every other source keeps P70i alone. is_part_of gains inverse_extension em:reconstructsFrom, written from the whole to the part (<VSF> em:reconstructsFrom <SF>) only when a SpecialFindUnit is part of a VirtualSpecialFindUnit. extension_when may now name the source class as well as the target; inverse_extension is new and read by the exporter and the importer (which skips it: the edge comes back from P46i). No edge added, no graph changed. v1.6.32 (MICRO i termini di em.ttl nel datamodel, 2026-10-26, decided by E.D. 2026-10-01): the eight edges of the AP11 physical family (abuts, cuts, fills, overlies, bonded_to, is_bonded_to, equals, is_physically_equal_to) gain mapping.subproperty, the em: subproperty of crmarchaeo:AP11_has_physical_relation_to they are written with (em:abuts, em:cuts, em:fills, em:overlies, em:bondedTo, em:physicallyEquals). Until now the pairing type_tag -> subproperty lived only in rdf_exporter.AP11_SUBPROPS; the exporter and the importer now BUILD that table from here, so a new physical relation is a datamodel change and not a code change. has_property.mapping gains when_inherited em:inheritsQualia, the subproperty the exporter already writes for an inherited owner (ownership.py). Mapping only: no edge added, nothing emitted differently. v1.6.31 (LA REVISIONE DELLA RISORSA, 2026-10-20, decision of E.D. 2026-09-30): NEW was_revision_of / had_revision — ResourceNode → ResourceNode, prov:wasRevisionOf (CIDOC projection crmdig:L21_used_as_derivation_source, as dtc_derived_from, because CRMdig has no term of its own for a revision). The name is the one the em.json container already uses for a ProjectVersion (container.py ProjectVersion.was_revision_of, projected as prov:wasRevisionOf by the RDF exporter): until now it was a FIELD of a document version, never an edge; it is widened here to resources. replace_file makes a NEW resource (same fields, the same files but the replaced one, the new file dtc_derived_from the old file) that was_revision_of the old one; the old one stays as it was, citable, and what pointed at it does not move by itself. No ui_phrase: a revision is made by replace_file, never picked from a menu. ADDITIVE: nothing narrowed. v1.6.30 (LA RISORSA E I SUOI FILE, 2026-10-18, decision of E.D. 2026-09-30): NEW has_file / is_file_of — ResourceNode → ResourceFileNode (node datamodel 1.6.17), crm:P106_is_composed_of + prov:hadMember; the edge `attributes` carry role (entry_point | member) and the path relative to the entry point, because one file sits in several resources under different paths. dtc_derived_from.source/target += ResourceFileNode, so a corrected texture declares the texture it comes from. Representations of the same thing (the datablock in the .blend as master, an OBJ export as distribution) are sibling ResourceNodes tied by dtc_derived_from: no new edge. NO REVISION EDGE exists for resources (measured: none of the 56 edges says «is a revision of»); replace_file keeps the old file and declares the new one derived from it, and the missing edge is reported, not invented. ADDITIVE: nothing narrowed. v1.6.29 (LA GEOMETRIA PER ORIGINE, 2026-10-11, decision of E.D. 2026-09-30): the vertices of a point / line / polyline reading are data of the region (node datamodel 1.6.15, data.coords); has_semantic_shape no longer carries a reading's .glb (the 1.6.27 hinge is migrated on opening). has_linked_resource.source += AnnotationRegionNode: above coords.inline_max_vertices (500) the vertices go to a .glb RESOURCE the region reaches with has_linked_resource (P67), as a proxy's shape and an RM do. ADDITIVE: nothing narrowed. v1.6.28 (IL PROXY COME RISORSA, 2026-10-11, decision of E.D. 2026-09-30): the proxy is a property of the US and its .glb is a RESOURCE. has_linked_resource.source += SemanticShapeNode: the shape reaches its glb with has_linked_resource -> ResourceNode(url_type proxy_model), the same hinge a Representation Model uses for its bytes (P67_refers_to), instead of carrying the path in its own url. SemanticShape.url is READ, never written: on opening, a shape with a url and no resource gets one (geometry/migrate.py, uuid5, idempotent), which also covers the older form EMtools still writes (US -has_semantic_shape-> shape with url proxies/<US>.glb). Convex hulls and spheres stay in the shape's data and ask for no resource. ADDITIVE: nothing narrowed. v1.6.27 (LA GEOMETRIA DELLA LETTURA, 2026-10-06, decision of E.D. 2026-09-29): the place of a reading is ONE node, AnnotationRegion with geometry_kind (region2d | passage | point | line | polyline; node datamodel 1.6.10). The chain is extractor -extracted_from-> region -is_on_resource-> what it is on, for every kind. is_on_resource.target += RepresentationModelNode, RepresentationModelDocNode, RepresentationModelSpecialFindNode: a point/line/polyline sits on a 3D model — the one edge that was missing. NO NEW EDGE for the .glb: the region reaches it with has_semantic_shape (source 'Node', already legal), the hinge a proxy uses (Property(geometry) -> SemanticShape.url). has_linked_resource was measured and NOT used: its source does not admit an AnnotationRegion, and it is the RM's hinge to a file, not a proxy's. ADDITIVE: nothing narrowed. s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.26 (DUE FRASI, 2026-10-04, E.D. 2026-09-29): combines.ui_phrase.as_source «{node} combining {x}» → «{node} of {x}» — the new node is the combiner and {x} the extractor it combines, and «Combiner combining D.3.1» said the verb twice; the eight other languages already read «di/de/von…». has_property.ui_phrase.as_source «{node} with {x}» CHECKED for every owner the edge admits (US and every stratigraphic unit, Document, RMDoc, Epoch, Graph): «US with material», «Document with height», «Epoch with absolute_time_start», «Graph with license» all read; kept. With more than one owner (v1.6.23) the same phrase names an inheriting owner created from an existing property. v1.6.25 (SUPPORTO AI E VERIFICA SUI NODI, 2026-10-04, decision of E.D. 2026-09-29): human authorship with AI support — an AI proposal a person accepts stays signed by the person, with the mark «supporto AI»; what was made with AI stays among the warnings until a person verifies it with their ORCID. On NODES this lives in `data`, with the names of the narrative blocks: `ai_assisted` {model, by (AuthorAINode id), prompt_ref, fields?}, `validated_by` (AuthorNode id with data.orcid), `validated_at`. See validated_by `node_verification_note` and s3dgraphy.ai_validation. NO EDGE CHANGED: the validated_by EDGE keeps source NarrativeNode; em.ttl widens em:validatedBy's domain to crm:E1 and adds em:aiAssistedBy/aiModel/aiPromptRef/aiAssistedField/validatedAt. v1.6.24 (L'ESTRATTORE LEGGE UN'UNITA', 2026-10-04, decision of E.D. 2026-09-29, extending the proposal of 2026-09-28 on SF/RSF): extracted_from.target += StratigraphicNode — an extractor may read FROM A UNIT that itself has the property it feeds (a reused find whose material is read off the unit it comes from), and not only from a document or an annotation region. The whole StratigraphicNode family, matched by class MRO (US, USV/s, USV/n, SF, RSF, VSF, USD, serSU…). A SUGGESTION, NOT AN ERROR: when the unit read from has no property of the same name as the property the extractor feeds, api.validate reports it under `info` (diagnostics.extraction_source_hints). The extractor keeps the name <source>.<ordinal> whatever its source is (the unit's name in place of the document's). ADDITIVE: nothing narrowed, no mapping changed. v1.6.23 (PIU' PROPRIETARI, 2026-10-04, decision of E.D. 2026-09-29, revisione della scrivania v7): a PropertyNode may have MORE THAN ONE incoming has_property — one unit INSTANTIATES another's property (a USV/s takes the material of the US it completes). The property stays ONE (one value, one paradata chain) with several owners. The inheritance is DECLARED, never automatic: the inheriting has_property carries the edge attribute `inherited: true`. The property stays in the ParadataNodeGroup of its ORIGINAL owner (the one that created it); the others refer to it through their own has_property, never through a group. See has_property `owners_note`. ADDITIVE: no edge, rule or mapping changed (has_property had no cardinality). v1.6.22 (FRASI DEGLI ARCHI, 2026-09-29, decision of E.D. 2026-09-29): `ui_phrase` {as_source, as_target} on the 34 edge types an interface proposes in a menu — the phrase that names a NEW node created linked to an existing one («US above X», «Property of X», «Document for X»). It is EM language, so it lives here and not in a consumer's i18n; the translations are in datamodel_translations.json, section `edge_types` (fields `ui_phrase_as_source` / `ui_phrase_as_target`). See `_ui_phrase_note`. ADDITIVE: no edge, rule or mapping changed. v1.6.21 (PROPRIETA' DIRETTE, 2026-09-28, decision of E.D. revising v1.6.1): has_property.source += EpochNode, GraphNode. Principle: every node that accepts properties receives them DIRECTLY. The sources are now the graph itself (GraphNode), the documents (DocumentNode, RepresentationModelDocNode), every stratigraphic unit (StratigraphicNode, matched by class MRO so SF, RSF, serSU, USD, USN, USNt... are included; the USNt node_type_restriction has scope stratigraphic and does not narrow has_property) and the epochs (EpochNode). v1.6.1 had routed an epoch's absolute_time_start/end through a ParadataNodeGroup because has_property refused an EpochNode (StratiMiner epoch claims degraded to generic_connection). The ParadataNodeGroup (DP-60, E89) is NOT a mandatory passage: it is a grouping, which can be created on the fly, useful to connect something to the whole set of a node's properties (connecting to the group equals connecting to each member PropertyNode) or to one property inside it. Coherence rule (validator, not datamodel): a PropertyNode in the PNG of X (is_in_paradata_nodegroup + X has_paradata_nodegroup PNG) requires X has_property that PropertyNode. has_paradata_nodegroup.source keeps EpochNode. NOT TOUCHED, question for E.D.: the cidoc P43_has_dimension has domain E70 Thing; A8/E31/E73 satisfy it, an E4 Period does not. s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.20 (UNA GRAFIA SOLA, 2026-09-27): NEW optional field `spelling_of` on an edge entry, naming the canonical entry of which this one is an OLDER SPELLING. Meaning: the SAME relation, the SAME RDF projection, ACCEPTED WHEN READ, NEVER WRITTEN — every writer (importers, exporters, merge, inference, sync) asks the datamodel for the canonical name (connections_loader: canonical_name / is_canonical False / normalize_edge_name) instead of keeping its own list. It is NOT `deprecated`: `deprecated` drops the edge from RDF on export AND import (measured: an is_bonded_to marked deprecated leaves 0 em:bondedTo triples), which is right for has_timebranch that nobody writes and wrong for a spelling pyArchInit writes every day. Set on the two legacy physical bonds: is_bonded_to spelling_of bonded_to, is_physically_equal_to spelling_of equals. em.ttl is unchanged: it already has ONE property per pair (em:bondedTo, em:physicallyEquals) and its `Maps to:` names both spellings. The datamodel is the source of truth for names (docs/SOURCE_OF_TRUTH.md). s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.18 (CRMem WIRING, 2026-09-24): il prefisso CIDOC-S3D esce dal datamodel. Non era un namespace: era una stringa che _resolve_prefixed non risolve, quindi nessuna tripla veniva emessa da quei campi. Disposizione termine per termine: incompatibleWith -> em:contrastsWith; belongsToAlternative -> em:belongsToAlternative (is_in_timebranch e has_timebranch); hasSymbolicSpatialRepresentation -> em:hasSemanticShape; isPartOfParadataGroup e hasParadataDocumentation RIMOSSI, perche' crm:P106i_forms_part_of e crm:P129i_is_subject_of dicono gia' quello che serve una volta tipizzato il gruppo; has3DRepresentation RIMOSSO sui tre archi di rappresentazione, perche' crm:P138i_has_representation con la co-tipizzazione del target a E36_Visual_Item basta e il '3D' sta nel rdf:type del bersaglio, non nella relazione. INOLTRE contrasts_with perde crm:P15_was_influenced_by: dominio E7_Activity contro un E4_Period, e comunque un'altra proposizione. Esce sulla sola em:contrastsWith. s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.17 (CIDOC REPAIR, 2026-09-21): a pass over IRIs that do not exist. An undeclared IRI raises no error anywhere — it makes a well-formed triple that no reasoner uses and no query finds — so these were found by parsing the official releases (CIDOC CRM 7.1.3 + Supplement, CRMarchaeo 2.1.1, CRMinf 1.2.1, CRMsci 3.2, CRMdig 5.0, CRMgeo) and checking every term this file cites against them. FIXED: the nine physical-relation edges (abuts, cuts, fills, overlies, bonded_to, is_bonded_to, equals, is_physically_equal_to, generic_connection) moved from AP11_has_physical_relation to AP11_has_physical_relation_to, the name CRMarchaeo has used since 2.0 — the old one exists only in 1.4.1. is_after: crm:P120_occurs_before is not declared in CRM 7.1.3, so crmarchaeo:AP28_occurs_before — already the extension_mapping, and the same proposition — is promoted to `cidoc` and the extension_mapping cleared; rdf_subject=target is UNCHANGED and still right. has_same_time: crm:P114_is_equal_in_time_to undeclared, same promotion of AP22. changed_from: P123_resulted_from -> P123i_resulted_from (the «i» of the inverse was missing). has_geoposition: the crmgeo:Q4 extension_mapping removed, P53 alone being valid and sufficient. THREE PROJECTIONS RAN BACKWARDS, none of them declaring rdf_subject, so the exporter wrote source-first and the proposition came out reversed: is_in_paradata_nodegroup P106_is_composed_of -> P106i_forms_part_of, has_paradata_nodegroup P70_documents -> P129i_is_subject_of (the reason ParadataNodeGroup becomes E89 in the node datamodel), and is_in_activity, where P9_consists_of is removed and NOTHING replaces it: neither P9i (needs an E4 Period as subject) nor P129i (needs an E89 as object; ActivityNodeGroup is E7) holds, and the empty field is a question for E.D., not an omission. Inverse properties were preferred to rdf_subject throughout: one indirection less. ALSO, by decision of E.D.: has_first_epoch and survive_in_epoch both accept FunctionalUnitNodeGroup, so a functional unit carries its own temporal index — the asymmetry with ActivityNodeGroup, which takes the first and never the second, is meant, because an activity is an event and a functional unit is a thing that persists. «CRMs3D» is renamed «CRMem», in components and in referenced_ontology_versions alike: the companion ontology is em.ttl and its namespace is em:, so the old name pointed at nothing anyone could look up. CRMsci moves 3.1 -> 3.2 (latest release). NOT TOUCHED and still open: the seven CIDOC-S3D properties and their extension_mappings, the E36 co-typing on has_representation_model*, and the direction of has_sub_epoch's P10_falls_within, which the repair report of the same day records as a decision for E.D. v1.6.15 (HW1, 2026-09-16): the act of acquisition gets a BODY. NEW dtc_happened_on_device — DTCNode -> DTCDeviceNode, crmdig:L12_happened_on_device — because until today the apparatus was a STRING inside how.acquisition, and a string cannot be asked «what did this machine produce», «which surveys used that scanner», «that lens was distorted, which models are affected». It attaches to the EVENT and not to the input or the output: the three dtc_kinds axes are the FLOW (what went in, what happened, what came out) and a device is what it happened ON — the distinction CRMdig draws between L12 and L10, and the one that makes the three questions askable. It is CONTEXT and carries no dtc_role, so a provenance walk does not enter it (per _dtc_role_note below). It has NO PROV-O projection on purpose: prov:used is taken by dtc_had_input and prov:Agent ranges over things that bear responsibility, which a camera does not — same honesty as the 2026-08-17 note on wasInformedBy. NOTHING IS REMOVED and nothing is narrowed. NOT DONE, and named so it is not forgotten: a rig (a sensor ON a drone) is an assembly of two devices and has no edge yet; the glyph family says it by drawing their connectors touching, which is a picture and not a statement. s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.14 (EM16-RMNG, 2026-09-10): the RM container becomes a first-class group in the graph. NEW is_in_representation_model_group — membership of a representation model in a RepresentationModelNodeGroup, on the is_in_* tag convention (is_in_activity / is_in_location / is_in_timebranch / is_in_paradata_nodegroup / is_in_functional_unit), 1:1 instead of m:n because a mesh belongs to exactly one container. WIDENED has_representation_model.target += RepresentationModelNodeGroup, so a Document points at the named set as well as at each model. NOTHING IS REMOVED: the epoch↔RM edges and the direct Document→RM edges stay written as before, without a flag and without a mode — the group sits beside and never in between (D1, resolved by E.D. on 2026-09-10). s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.11 (batch ingestion, 2026-08-17): two widenings for bulk assets. has_author.source DTCProcessNode -> DTCNode, so an ACQUISITION event (D12) can carry the author of a whole lot; dtc_had_input.target += DTCNode, so a DECLARED derivation can name a whole acquisition as its input (one input, not 500 edges) — that case projects as prov:wasInformedBy, not prov:used/L10, which range over digital objects and would be wrong for an event. v1.6.8 (MIG1-A): graph-scope rights metadata become first-class nodes (DP-65). is_in_paradata_nodegroup.source += AuthorNode/LicenseNode/EmbargoNode and has_paradata_nodegroup.source += GraphNode, so the graph-self node (GraphNode) owns a graph-scope ParadataNodeGroup whose members are the AuthorNode/LicenseNode/EmbargoNode (+ the DP-65 GeoPositionNode shift), replacing the legacy graph.data['author_name'/'license'/'embargo'] fields. The Data Funnel canvas tier now reads these member nodes (one reader per scope); a one-shot load-time migration materialises the legacy fields into nodes. v1.6.7 (BUGFIX-CONN3): closes the two silent follow-ups of CONN2. has_documentation.source gains PropertyNode (judicious widening): the honest reading of a legacy yEd dashed PropertyNode→Document connector is P70i_is_documented_in ('the property is documented in this source'), NOT has_visual_reference (which CONN2 moved to PropertyNode→ResourceNode). The import heuristic (import_graphml.enhance_edge_type) now routes PropertyNode→Document to has_documentation and the rarer CombinerNode/ParadataNode→Document to generic_connection+warning (a combiner aggregates extractors and cites no document; the DTC chain is NOT synthesised at import). Shelf: hat_as_document no longer offers has_visual_reference (a Document attaches via has_documentation/extracted_from); a new hat_as_visual_resource attaches a ResourceNode image via has_visual_reference from a PropertyNode — the correct home after CONN2. No illegal edge is produced or expected. v1.6.6 (BUGFIX-CONN2): closes the two open domain questions on has_visual_reference (E.D. 2026-08-05). SOURCE narrowed to exactly [PropertyNode]: only a property (an asserted quale) is what a visual reference illustrates; the generic ParadataNode entry is dropped, which — because ExtractorNode, CombinerNode and DocumentNode are all subclasses of ParadataNode — now excludes them by class hierarchy (a PropertyNode is neither a sibling nor a parent of the others). The extractor/combiner denied_edges from v1.6.5 are therefore REDUNDANT for this edge but are KEPT as a defensive guard (they still bite if the source is ever broadened back to ParadataNode). TARGET changed from [DocumentNode] to [ResourceNode]: the oddity was that a visual reference pointed at a source-document (E31) rather than at a visual resource. It now points at the resource-layer image node (ResourceNode = E73 Information Object / ExternalResourceReference — the same P67 hinge RM/RMDoc use via has_linked_resource), keeping DocumentNode = fonte. CIDOC stays P138i_has_representation with the target co-typed E36 Visual Item: E36 is a subclass of E73, so co-typing a ResourceNode as E36 is range-consistent (it was NOT, strictly, for an E31 Document). FOLLOW-UPS flagged for E.D. (see end-of report): (a) import_graphml.enhance_edge_type still hardcodes PropertyNode/Combiner/Paradata→DocumentNode ⇒ has_visual_reference (legacy yEd heuristic, now produces an edge this datamodel refuses) — needs a domain decision on what legacy paradata→document edges become; (b) shelf.hat_as_document lists has_visual_reference among the Document-attach edges — it can no longer validate (target is ResourceNode), so a paradata attach silently no longer attaches; a hat_as_visual_resource(ResourceNode)+has_visual_reference path is the proper home. v1.6.5 (BUGFIX-CONN): has_visual_reference is no longer offered FROM an ExtractorNode or a CombinerNode. An extractor toward a document expresses ONLY extracted_from (its relation to the source is the extraction, not an illustration); a combiner aggregates extractors and illustrates nothing. Because ExtractorNode, CombinerNode and PropertyNode are all subclasses of ParadataNode, and has_visual_reference.source lists ParadataNode, simply dropping the two subtypes from the source list would not exclude them (they still match via the parent class). So this is expressed with node_type_restrictions (keyed by RUNTIME node_type, like USNt) using a new denied_edges blacklist (the mirror of allowed_edges): extractor/combiner deny has_visual_reference. PropertyNode and any other legitimate ParadataNode source keep it unchanged. OPEN domain question for E.D.: which paradata node-types may legitimately have a visual reference (today source = PropertyNode/ExtractorNode/CombinerNode/ParadataNode) — extractor/combiner removed; the rest left as-is, not invented. v1.6.1: has_paradata_nodegroup source extended to include EpochNode — an epoch can now own a ParadataNodeGroup holding its temporal-definition properties (e.g. absolute_time_start/end as PropertyNodes with paradata provenance), mirroring how a StratigraphicNode carries its paradata group. v1.6.0 (paired with node datamodel v1.6.0) introduces: bug fix on is_in_paradata_nodegroup (typo 'ProperrtyNOde' → 'PropertyNode'); semantic fix on has_documentation (P104_is_subject_to → P70i_is_documented_in — P104 means 'subject to a legal right', not 'has documentation'); deprecation of has_timebranch as duplicate of is_in_timebranch (the latter is the canonical one — used by import_graphml.py and graphml_patcher.py; the former exists only in config JSON); component list aligned with node datamodel (HDT-O, PROV-O added). HDT-O containment properties (hdto:contains_HDT, hdto:contains_SU, hdto:isPrimary) and physical-relation discriminator subproperties (em:abuts, em:cuts, em:fills, em:overlies, em:bonded_to, em:equals as rdfs:subPropertyOf crmarchaeo:AP11_has_physical_relation) to be added in v1.6.1. v1.5.3 introduced canonical/reverse directionality with verb-based labels for clear socket identification in node editors. v1.5.4 added 'has_visual_reference' edge type. v1.5.5 added 'is_in_location' edge type with context-sensitive CIDOC mapping (P53 for node→location, P89 for the recursive location→location hierarchy) and an optional 'is_primary' boolean attribute (s3d:isPrimary, proposed). v1.6.3: added node_type_restrictions — a per-node-type narrowing of the class-level edge rules (POL5): USN (the NEUTRAL stratigraphic unit, a risparmio) takes is_after/is_before and nothing else, because a void cannot cut, fill, abut or bond. v1.6.4 (POL6): the same restriction, moved to USNt — the tokens went back to their conventional meanings, USN = US negativa (all relations, it is a unit of the sequence) and USNt = US neutra (sequence only).",
|
|
2
|
+
"s3Dgraphy_connections_model_version": "1.6.40",
|
|
3
|
+
"description": "v1.6.40 (giro dell'11 ottobre, decided by E.D. 2026-10-11): study_took_place_at reaches the site or a saggio in it (a LocationNodeGroup kind study, is_in_location the site); description only. v1.6.39 (MICRO lo studio usabile, 2026-10-10): study_took_place_at (StudyNode → LocationNodeGroup, crm:P7_took_place_at). v1.6.38 (MICRO le entità spaziotemporali, decided by E.D. 2026-10-10: «Documenti, autori e unità stratigrafiche sono entità spaziotemporali e dovrebbero avere tutto il potenziale e la formalità delle US: start, end, posizione nel grafo matrix»): a DocumentNode and an AuthorNode (and so an AuthorAINode) take the temporal edges of a stratigraphic unit. has_property.source += AuthorNode — a person has a start and an end like a unit (absolute_time_start / absolute_time_end; for a person they read «date of birth» / «date of death», for a model «release» / «retirement», em_qualia_types 1.6.9 owner_names), and any other quale. has_first_epoch.source += AuthorNode (DocumentNode already had it, as a ParadataNode): the lane of the matrix where the entity begins, which is also where a client draws it. survive_in_epoch.source += DocumentNode, AuthorNode: a document that lasts (an inscription still read centuries later), an author active across two epochs of a study. is_after and has_same_time, source and target += DocumentNode, AuthorNode: the sequence of the matrix is the same order for the three — an excavation report is after the excavation, an engraving after the destruction it shows, a commentary after the text it reads; the chronology (Graph.chronology) dates documents and authors with the same rules as units (written, epoch, tpq/taq), CHRONOLOGY_TYPES += document, author, author_ai. is_in_activity.source += AuthorNode (an author's part in a campaign). WHAT IS NOT WIDENED, and why: the PHYSICAL relations (overlies, cuts, fills, abuts, is_bonded_to, is_physically_equal_to) stay between units only — a person does not cover a layer; changed_from and is_part_of stay stratigraphic (a temporal instance and a containment are statements about matter); is_in_timebranch waits for the branches. The RDF mappings are UNCHANGED: AP28/AP22 were already emitted on A8 units, which are persistent items like E31 and E21, so the three are read the same way; em:firstAttestedInEpoch and em:survivesInEpoch widen their domain to crm:E77_Persistent_Item in em.ttl 1.6.16. An instance is still a VIEW: em_visual_rules.paradata_instances gains `authorship`, so the author of a reading is drawn inside the group that reads, like a document (s3dgraphy.paradata_view). v1.6.37 (MICRO l'istanza è una vista, decided by E.D. 2026-10-09, evening: «non ha nessun senso fare un'istanza nel triple store: è solamente una modalità grafica di rappresentare il grafo»): the extractor that reads another unit's property points at the MASTER, the property in its own unit, as it points at a document; there is NO instance node in em.json nor in the RDF (the 1.6.36 data.instance_of is gone, and a property instance stored with it is folded onto its master when an em.json is read, s3dgraphy.property_source.fold_stored_instances). A client draws the master inside the reader's group as a VIEW, by the one rule for documents and properties in em_visual_rules.json → paradata_instances (s3dgraphy.paradata_view.view_instances). extracted_from.target keeps PropertyNode (_note_property and property_source_note rewritten: the target is the master); is_in_paradata_nodegroup.property_instance_note is gone (nothing to say: no instance joins a group). paradata_reasoning: property_instance becomes `instance` (a document or a property drawn in the group that reads it), the instance_badge placeholder becomes {owner} (a unit, or the epoch of a document), refresh_instance is gone. Nothing narrowed, no mapping changed. v1.6.36 (MICRO la proprietà come fonte, decided by E.D. 2026-10-09): extracted_from.target += PropertyNode — an extractor may read ANOTHER UNIT'S PROPERTY, through an INSTANCE of it in the reader's paradata group (a PropertyNode with data.instance_of = the master's id, data.instance_owner = the master's unit; s3dgraphy.property_source). The property becomes a source like a document: the upper parts of a temple take the material of the lower parts found, the trusses the wood of the fragments. is_in_paradata_nodegroup already admitted PropertyNode (measured): the instance joins the reader's group with no widening. NEW top-level block `paradata_reasoning`: the EM words of the reasoning between properties (the instance and its badge, the diagnostics source_changed / source_removed / reasoning_cycle / undeclared_owners, the cures), translated in datamodel_translations.json section `reasoning`. ADDITIVE: nothing narrowed, no mapping changed. v1.6.35 (dev27, 2026-10-31, decided by E.D. 2026-10-01, «il testo, la risorsa e la selezione»): was_revision_of admits TranslationNode on both ends — a translation realigned after its original changed is a new TranslationNode that was_revision_of the old one (s3dgraphy.translation.realign_translation). v1.6.34 (MICRO le traduzioni, 2026-10-29, decided by E.D. 2026-10-01): NEW has_translation / is_translation_of — any node → TranslationNode (node datamodel 1.6.20), crm:P73_has_translation, the CIDOC relation of a text to its translation. has_author.source += TranslationNode (who translated). extracted_from.source += TranslationNode: a translation taken from a published EDITION reaches the DocumentNode of that edition with the edge that already says «this text was taken from that source», instead of a second name for the same relation. v1.6.33 (MICRO la lingua dei dati, part H, 2026-10-27, decided by E.D. 2026-10-01): two em.ttl terms that had no edge now leave with the edge nearest to them. has_documentation gains extension_mapping em:derivedFromDocument, guarded by extension_when.source_node_class (DocumentaryStratigraphicUnit, SeriesOfDocumentaryStratigraphicUnit): a USD documented in a document is derived from it; every other source keeps P70i alone. is_part_of gains inverse_extension em:reconstructsFrom, written from the whole to the part (<VSF> em:reconstructsFrom <SF>) only when a SpecialFindUnit is part of a VirtualSpecialFindUnit. extension_when may now name the source class as well as the target; inverse_extension is new and read by the exporter and the importer (which skips it: the edge comes back from P46i). No edge added, no graph changed. v1.6.32 (MICRO i termini di em.ttl nel datamodel, 2026-10-26, decided by E.D. 2026-10-01): the eight edges of the AP11 physical family (abuts, cuts, fills, overlies, bonded_to, is_bonded_to, equals, is_physically_equal_to) gain mapping.subproperty, the em: subproperty of crmarchaeo:AP11_has_physical_relation_to they are written with (em:abuts, em:cuts, em:fills, em:overlies, em:bondedTo, em:physicallyEquals). Until now the pairing type_tag -> subproperty lived only in rdf_exporter.AP11_SUBPROPS; the exporter and the importer now BUILD that table from here, so a new physical relation is a datamodel change and not a code change. has_property.mapping gains when_inherited em:inheritsQualia, the subproperty the exporter already writes for an inherited owner (ownership.py). Mapping only: no edge added, nothing emitted differently. v1.6.31 (LA REVISIONE DELLA RISORSA, 2026-10-20, decision of E.D. 2026-09-30): NEW was_revision_of / had_revision — ResourceNode → ResourceNode, prov:wasRevisionOf (CIDOC projection crmdig:L21_used_as_derivation_source, as dtc_derived_from, because CRMdig has no term of its own for a revision). The name is the one the em.json container already uses for a ProjectVersion (container.py ProjectVersion.was_revision_of, projected as prov:wasRevisionOf by the RDF exporter): until now it was a FIELD of a document version, never an edge; it is widened here to resources. replace_file makes a NEW resource (same fields, the same files but the replaced one, the new file dtc_derived_from the old file) that was_revision_of the old one; the old one stays as it was, citable, and what pointed at it does not move by itself. No ui_phrase: a revision is made by replace_file, never picked from a menu. ADDITIVE: nothing narrowed. v1.6.30 (LA RISORSA E I SUOI FILE, 2026-10-18, decision of E.D. 2026-09-30): NEW has_file / is_file_of — ResourceNode → ResourceFileNode (node datamodel 1.6.17), crm:P106_is_composed_of + prov:hadMember; the edge `attributes` carry role (entry_point | member) and the path relative to the entry point, because one file sits in several resources under different paths. dtc_derived_from.source/target += ResourceFileNode, so a corrected texture declares the texture it comes from. Representations of the same thing (the datablock in the .blend as master, an OBJ export as distribution) are sibling ResourceNodes tied by dtc_derived_from: no new edge. NO REVISION EDGE exists for resources (measured: none of the 56 edges says «is a revision of»); replace_file keeps the old file and declares the new one derived from it, and the missing edge is reported, not invented. ADDITIVE: nothing narrowed. v1.6.29 (LA GEOMETRIA PER ORIGINE, 2026-10-11, decision of E.D. 2026-09-30): the vertices of a point / line / polyline reading are data of the region (node datamodel 1.6.15, data.coords); has_semantic_shape no longer carries a reading's .glb (the 1.6.27 hinge is migrated on opening). has_linked_resource.source += AnnotationRegionNode: above coords.inline_max_vertices (500) the vertices go to a .glb RESOURCE the region reaches with has_linked_resource (P67), as a proxy's shape and an RM do. ADDITIVE: nothing narrowed. v1.6.28 (IL PROXY COME RISORSA, 2026-10-11, decision of E.D. 2026-09-30): the proxy is a property of the US and its .glb is a RESOURCE. has_linked_resource.source += SemanticShapeNode: the shape reaches its glb with has_linked_resource -> ResourceNode(url_type proxy_model), the same hinge a Representation Model uses for its bytes (P67_refers_to), instead of carrying the path in its own url. SemanticShape.url is READ, never written: on opening, a shape with a url and no resource gets one (geometry/migrate.py, uuid5, idempotent), which also covers the older form EMtools still writes (US -has_semantic_shape-> shape with url proxies/<US>.glb). Convex hulls and spheres stay in the shape's data and ask for no resource. ADDITIVE: nothing narrowed. v1.6.27 (LA GEOMETRIA DELLA LETTURA, 2026-10-06, decision of E.D. 2026-09-29): the place of a reading is ONE node, AnnotationRegion with geometry_kind (region2d | passage | point | line | polyline; node datamodel 1.6.10). The chain is extractor -extracted_from-> region -is_on_resource-> what it is on, for every kind. is_on_resource.target += RepresentationModelNode, RepresentationModelDocNode, RepresentationModelSpecialFindNode: a point/line/polyline sits on a 3D model — the one edge that was missing. NO NEW EDGE for the .glb: the region reaches it with has_semantic_shape (source 'Node', already legal), the hinge a proxy uses (Property(geometry) -> SemanticShape.url). has_linked_resource was measured and NOT used: its source does not admit an AnnotationRegion, and it is the RM's hinge to a file, not a proxy's. ADDITIVE: nothing narrowed. s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.26 (DUE FRASI, 2026-10-04, E.D. 2026-09-29): combines.ui_phrase.as_source «{node} combining {x}» → «{node} of {x}» — the new node is the combiner and {x} the extractor it combines, and «Combiner combining D.3.1» said the verb twice; the eight other languages already read «di/de/von…». has_property.ui_phrase.as_source «{node} with {x}» CHECKED for every owner the edge admits (US and every stratigraphic unit, Document, RMDoc, Epoch, Graph): «US with material», «Document with height», «Epoch with absolute_time_start», «Graph with license» all read; kept. With more than one owner (v1.6.23) the same phrase names an inheriting owner created from an existing property. v1.6.25 (SUPPORTO AI E VERIFICA SUI NODI, 2026-10-04, decision of E.D. 2026-09-29): human authorship with AI support — an AI proposal a person accepts stays signed by the person, with the mark «supporto AI»; what was made with AI stays among the warnings until a person verifies it with their ORCID. On NODES this lives in `data`, with the names of the narrative blocks: `ai_assisted` {model, by (AuthorAINode id), prompt_ref, fields?}, `validated_by` (AuthorNode id with data.orcid), `validated_at`. See validated_by `node_verification_note` and s3dgraphy.ai_validation. NO EDGE CHANGED: the validated_by EDGE keeps source NarrativeNode; em.ttl widens em:validatedBy's domain to crm:E1 and adds em:aiAssistedBy/aiModel/aiPromptRef/aiAssistedField/validatedAt. v1.6.24 (L'ESTRATTORE LEGGE UN'UNITA', 2026-10-04, decision of E.D. 2026-09-29, extending the proposal of 2026-09-28 on SF/RSF): extracted_from.target += StratigraphicNode — an extractor may read FROM A UNIT that itself has the property it feeds (a reused find whose material is read off the unit it comes from), and not only from a document or an annotation region. The whole StratigraphicNode family, matched by class MRO (US, USV/s, USV/n, SF, RSF, VSF, USD, serSU…). A SUGGESTION, NOT AN ERROR: when the unit read from has no property of the same name as the property the extractor feeds, api.validate reports it under `info` (diagnostics.extraction_source_hints). The extractor keeps the name <source>.<ordinal> whatever its source is (the unit's name in place of the document's). ADDITIVE: nothing narrowed, no mapping changed. v1.6.23 (PIU' PROPRIETARI, 2026-10-04, decision of E.D. 2026-09-29, revisione della scrivania v7): a PropertyNode may have MORE THAN ONE incoming has_property — one unit INSTANTIATES another's property (a USV/s takes the material of the US it completes). The property stays ONE (one value, one paradata chain) with several owners. The inheritance is DECLARED, never automatic: the inheriting has_property carries the edge attribute `inherited: true`. The property stays in the ParadataNodeGroup of its ORIGINAL owner (the one that created it); the others refer to it through their own has_property, never through a group. See has_property `owners_note`. ADDITIVE: no edge, rule or mapping changed (has_property had no cardinality). v1.6.22 (FRASI DEGLI ARCHI, 2026-09-29, decision of E.D. 2026-09-29): `ui_phrase` {as_source, as_target} on the 34 edge types an interface proposes in a menu — the phrase that names a NEW node created linked to an existing one («US above X», «Property of X», «Document for X»). It is EM language, so it lives here and not in a consumer's i18n; the translations are in datamodel_translations.json, section `edge_types` (fields `ui_phrase_as_source` / `ui_phrase_as_target`). See `_ui_phrase_note`. ADDITIVE: no edge, rule or mapping changed. v1.6.21 (PROPRIETA' DIRETTE, 2026-09-28, decision of E.D. revising v1.6.1): has_property.source += EpochNode, GraphNode. Principle: every node that accepts properties receives them DIRECTLY. The sources are now the graph itself (GraphNode), the documents (DocumentNode, RepresentationModelDocNode), every stratigraphic unit (StratigraphicNode, matched by class MRO so SF, RSF, serSU, USD, USN, USNt... are included; the USNt node_type_restriction has scope stratigraphic and does not narrow has_property) and the epochs (EpochNode). v1.6.1 had routed an epoch's absolute_time_start/end through a ParadataNodeGroup because has_property refused an EpochNode (StratiMiner epoch claims degraded to generic_connection). The ParadataNodeGroup (DP-60, E89) is NOT a mandatory passage: it is a grouping, which can be created on the fly, useful to connect something to the whole set of a node's properties (connecting to the group equals connecting to each member PropertyNode) or to one property inside it. Coherence rule (validator, not datamodel): a PropertyNode in the PNG of X (is_in_paradata_nodegroup + X has_paradata_nodegroup PNG) requires X has_property that PropertyNode. has_paradata_nodegroup.source keeps EpochNode. NOT TOUCHED, question for E.D.: the cidoc P43_has_dimension has domain E70 Thing; A8/E31/E73 satisfy it, an E4 Period does not. s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.20 (UNA GRAFIA SOLA, 2026-09-27): NEW optional field `spelling_of` on an edge entry, naming the canonical entry of which this one is an OLDER SPELLING. Meaning: the SAME relation, the SAME RDF projection, ACCEPTED WHEN READ, NEVER WRITTEN — every writer (importers, exporters, merge, inference, sync) asks the datamodel for the canonical name (connections_loader: canonical_name / is_canonical False / normalize_edge_name) instead of keeping its own list. It is NOT `deprecated`: `deprecated` drops the edge from RDF on export AND import (measured: an is_bonded_to marked deprecated leaves 0 em:bondedTo triples), which is right for has_timebranch that nobody writes and wrong for a spelling pyArchInit writes every day. Set on the two legacy physical bonds: is_bonded_to spelling_of bonded_to, is_physically_equal_to spelling_of equals. em.ttl is unchanged: it already has ONE property per pair (em:bondedTo, em:physicallyEquals) and its `Maps to:` names both spellings. The datamodel is the source of truth for names (docs/SOURCE_OF_TRUTH.md). s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.18 (CRMem WIRING, 2026-09-24): il prefisso CIDOC-S3D esce dal datamodel. Non era un namespace: era una stringa che _resolve_prefixed non risolve, quindi nessuna tripla veniva emessa da quei campi. Disposizione termine per termine: incompatibleWith -> em:contrastsWith; belongsToAlternative -> em:belongsToAlternative (is_in_timebranch e has_timebranch); hasSymbolicSpatialRepresentation -> em:hasSemanticShape; isPartOfParadataGroup e hasParadataDocumentation RIMOSSI, perche' crm:P106i_forms_part_of e crm:P129i_is_subject_of dicono gia' quello che serve una volta tipizzato il gruppo; has3DRepresentation RIMOSSO sui tre archi di rappresentazione, perche' crm:P138i_has_representation con la co-tipizzazione del target a E36_Visual_Item basta e il '3D' sta nel rdf:type del bersaglio, non nella relazione. INOLTRE contrasts_with perde crm:P15_was_influenced_by: dominio E7_Activity contro un E4_Period, e comunque un'altra proposizione. Esce sulla sola em:contrastsWith. s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.17 (CIDOC REPAIR, 2026-09-21): a pass over IRIs that do not exist. An undeclared IRI raises no error anywhere — it makes a well-formed triple that no reasoner uses and no query finds — so these were found by parsing the official releases (CIDOC CRM 7.1.3 + Supplement, CRMarchaeo 2.1.1, CRMinf 1.2.1, CRMsci 3.2, CRMdig 5.0, CRMgeo) and checking every term this file cites against them. FIXED: the nine physical-relation edges (abuts, cuts, fills, overlies, bonded_to, is_bonded_to, equals, is_physically_equal_to, generic_connection) moved from AP11_has_physical_relation to AP11_has_physical_relation_to, the name CRMarchaeo has used since 2.0 — the old one exists only in 1.4.1. is_after: crm:P120_occurs_before is not declared in CRM 7.1.3, so crmarchaeo:AP28_occurs_before — already the extension_mapping, and the same proposition — is promoted to `cidoc` and the extension_mapping cleared; rdf_subject=target is UNCHANGED and still right. has_same_time: crm:P114_is_equal_in_time_to undeclared, same promotion of AP22. changed_from: P123_resulted_from -> P123i_resulted_from (the «i» of the inverse was missing). has_geoposition: the crmgeo:Q4 extension_mapping removed, P53 alone being valid and sufficient. THREE PROJECTIONS RAN BACKWARDS, none of them declaring rdf_subject, so the exporter wrote source-first and the proposition came out reversed: is_in_paradata_nodegroup P106_is_composed_of -> P106i_forms_part_of, has_paradata_nodegroup P70_documents -> P129i_is_subject_of (the reason ParadataNodeGroup becomes E89 in the node datamodel), and is_in_activity, where P9_consists_of is removed and NOTHING replaces it: neither P9i (needs an E4 Period as subject) nor P129i (needs an E89 as object; ActivityNodeGroup is E7) holds, and the empty field is a question for E.D., not an omission. Inverse properties were preferred to rdf_subject throughout: one indirection less. ALSO, by decision of E.D.: has_first_epoch and survive_in_epoch both accept FunctionalUnitNodeGroup, so a functional unit carries its own temporal index — the asymmetry with ActivityNodeGroup, which takes the first and never the second, is meant, because an activity is an event and a functional unit is a thing that persists. «CRMs3D» is renamed «CRMem», in components and in referenced_ontology_versions alike: the companion ontology is em.ttl and its namespace is em:, so the old name pointed at nothing anyone could look up. CRMsci moves 3.1 -> 3.2 (latest release). NOT TOUCHED and still open: the seven CIDOC-S3D properties and their extension_mappings, the E36 co-typing on has_representation_model*, and the direction of has_sub_epoch's P10_falls_within, which the repair report of the same day records as a decision for E.D. v1.6.15 (HW1, 2026-09-16): the act of acquisition gets a BODY. NEW dtc_happened_on_device — DTCNode -> DTCDeviceNode, crmdig:L12_happened_on_device — because until today the apparatus was a STRING inside how.acquisition, and a string cannot be asked «what did this machine produce», «which surveys used that scanner», «that lens was distorted, which models are affected». It attaches to the EVENT and not to the input or the output: the three dtc_kinds axes are the FLOW (what went in, what happened, what came out) and a device is what it happened ON — the distinction CRMdig draws between L12 and L10, and the one that makes the three questions askable. It is CONTEXT and carries no dtc_role, so a provenance walk does not enter it (per _dtc_role_note below). It has NO PROV-O projection on purpose: prov:used is taken by dtc_had_input and prov:Agent ranges over things that bear responsibility, which a camera does not — same honesty as the 2026-08-17 note on wasInformedBy. NOTHING IS REMOVED and nothing is narrowed. NOT DONE, and named so it is not forgotten: a rig (a sensor ON a drone) is an assembly of two devices and has no edge yet; the glyph family says it by drawing their connectors touching, which is a picture and not a statement. s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.14 (EM16-RMNG, 2026-09-10): the RM container becomes a first-class group in the graph. NEW is_in_representation_model_group — membership of a representation model in a RepresentationModelNodeGroup, on the is_in_* tag convention (is_in_activity / is_in_location / is_in_timebranch / is_in_paradata_nodegroup / is_in_functional_unit), 1:1 instead of m:n because a mesh belongs to exactly one container. WIDENED has_representation_model.target += RepresentationModelNodeGroup, so a Document points at the named set as well as at each model. NOTHING IS REMOVED: the epoch↔RM edges and the direct Document→RM edges stay written as before, without a flag and without a mode — the group sits beside and never in between (D1, resolved by E.D. on 2026-09-10). s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.11 (batch ingestion, 2026-08-17): two widenings for bulk assets. has_author.source DTCProcessNode -> DTCNode, so an ACQUISITION event (D12) can carry the author of a whole lot; dtc_had_input.target += DTCNode, so a DECLARED derivation can name a whole acquisition as its input (one input, not 500 edges) — that case projects as prov:wasInformedBy, not prov:used/L10, which range over digital objects and would be wrong for an event. v1.6.8 (MIG1-A): graph-scope rights metadata become first-class nodes (DP-65). is_in_paradata_nodegroup.source += AuthorNode/LicenseNode/EmbargoNode and has_paradata_nodegroup.source += GraphNode, so the graph-self node (GraphNode) owns a graph-scope ParadataNodeGroup whose members are the AuthorNode/LicenseNode/EmbargoNode (+ the DP-65 GeoPositionNode shift), replacing the legacy graph.data['author_name'/'license'/'embargo'] fields. The Data Funnel canvas tier now reads these member nodes (one reader per scope); a one-shot load-time migration materialises the legacy fields into nodes. v1.6.7 (BUGFIX-CONN3): closes the two silent follow-ups of CONN2. has_documentation.source gains PropertyNode (judicious widening): the honest reading of a legacy yEd dashed PropertyNode→Document connector is P70i_is_documented_in ('the property is documented in this source'), NOT has_visual_reference (which CONN2 moved to PropertyNode→ResourceNode). The import heuristic (import_graphml.enhance_edge_type) now routes PropertyNode→Document to has_documentation and the rarer CombinerNode/ParadataNode→Document to generic_connection+warning (a combiner aggregates extractors and cites no document; the DTC chain is NOT synthesised at import). Shelf: hat_as_document no longer offers has_visual_reference (a Document attaches via has_documentation/extracted_from); a new hat_as_visual_resource attaches a ResourceNode image via has_visual_reference from a PropertyNode — the correct home after CONN2. No illegal edge is produced or expected. v1.6.6 (BUGFIX-CONN2): closes the two open domain questions on has_visual_reference (E.D. 2026-08-05). SOURCE narrowed to exactly [PropertyNode]: only a property (an asserted quale) is what a visual reference illustrates; the generic ParadataNode entry is dropped, which — because ExtractorNode, CombinerNode and DocumentNode are all subclasses of ParadataNode — now excludes them by class hierarchy (a PropertyNode is neither a sibling nor a parent of the others). The extractor/combiner denied_edges from v1.6.5 are therefore REDUNDANT for this edge but are KEPT as a defensive guard (they still bite if the source is ever broadened back to ParadataNode). TARGET changed from [DocumentNode] to [ResourceNode]: the oddity was that a visual reference pointed at a source-document (E31) rather than at a visual resource. It now points at the resource-layer image node (ResourceNode = E73 Information Object / ExternalResourceReference — the same P67 hinge RM/RMDoc use via has_linked_resource), keeping DocumentNode = fonte. CIDOC stays P138i_has_representation with the target co-typed E36 Visual Item: E36 is a subclass of E73, so co-typing a ResourceNode as E36 is range-consistent (it was NOT, strictly, for an E31 Document). FOLLOW-UPS flagged for E.D. (see end-of report): (a) import_graphml.enhance_edge_type still hardcodes PropertyNode/Combiner/Paradata→DocumentNode ⇒ has_visual_reference (legacy yEd heuristic, now produces an edge this datamodel refuses) — needs a domain decision on what legacy paradata→document edges become; (b) shelf.hat_as_document lists has_visual_reference among the Document-attach edges — it can no longer validate (target is ResourceNode), so a paradata attach silently no longer attaches; a hat_as_visual_resource(ResourceNode)+has_visual_reference path is the proper home. v1.6.5 (BUGFIX-CONN): has_visual_reference is no longer offered FROM an ExtractorNode or a CombinerNode. An extractor toward a document expresses ONLY extracted_from (its relation to the source is the extraction, not an illustration); a combiner aggregates extractors and illustrates nothing. Because ExtractorNode, CombinerNode and PropertyNode are all subclasses of ParadataNode, and has_visual_reference.source lists ParadataNode, simply dropping the two subtypes from the source list would not exclude them (they still match via the parent class). So this is expressed with node_type_restrictions (keyed by RUNTIME node_type, like USNt) using a new denied_edges blacklist (the mirror of allowed_edges): extractor/combiner deny has_visual_reference. PropertyNode and any other legitimate ParadataNode source keep it unchanged. OPEN domain question for E.D.: which paradata node-types may legitimately have a visual reference (today source = PropertyNode/ExtractorNode/CombinerNode/ParadataNode) — extractor/combiner removed; the rest left as-is, not invented. v1.6.1: has_paradata_nodegroup source extended to include EpochNode — an epoch can now own a ParadataNodeGroup holding its temporal-definition properties (e.g. absolute_time_start/end as PropertyNodes with paradata provenance), mirroring how a StratigraphicNode carries its paradata group. v1.6.0 (paired with node datamodel v1.6.0) introduces: bug fix on is_in_paradata_nodegroup (typo 'ProperrtyNOde' → 'PropertyNode'); semantic fix on has_documentation (P104_is_subject_to → P70i_is_documented_in — P104 means 'subject to a legal right', not 'has documentation'); deprecation of has_timebranch as duplicate of is_in_timebranch (the latter is the canonical one — used by import_graphml.py and graphml_patcher.py; the former exists only in config JSON); component list aligned with node datamodel (HDT-O, PROV-O added). HDT-O containment properties (hdto:contains_HDT, hdto:contains_SU, hdto:isPrimary) and physical-relation discriminator subproperties (em:abuts, em:cuts, em:fills, em:overlies, em:bonded_to, em:equals as rdfs:subPropertyOf crmarchaeo:AP11_has_physical_relation) to be added in v1.6.1. v1.5.3 introduced canonical/reverse directionality with verb-based labels for clear socket identification in node editors. v1.5.4 added 'has_visual_reference' edge type. v1.5.5 added 'is_in_location' edge type with context-sensitive CIDOC mapping (P53 for node→location, P89 for the recursive location→location hierarchy) and an optional 'is_primary' boolean attribute (s3d:isPrimary, proposed). v1.6.3: added node_type_restrictions — a per-node-type narrowing of the class-level edge rules (POL5): USN (the NEUTRAL stratigraphic unit, a risparmio) takes is_after/is_before and nothing else, because a void cannot cut, fill, abut or bond. v1.6.4 (POL6): the same restriction, moved to USNt — the tokens went back to their conventional meanings, USN = US negativa (all relations, it is a unit of the sequence) and USNt = US neutra (sequence only).",
|
|
4
4
|
"components": [
|
|
5
5
|
"CIDOC-CRM",
|
|
6
6
|
"CRMarchaeo",
|
|
@@ -1519,7 +1519,7 @@
|
|
|
1519
1519
|
"study_took_place_at": {
|
|
1520
1520
|
"name": "study_took_place_at",
|
|
1521
1521
|
"label": "Study took place at",
|
|
1522
|
-
"description": "Links an HC9 Study to the topographic place where it was carried out — the LocationNodeGroup of the site, the last link of the toponym chain (nation → region → province → comune → site). E.D., 10 Oct 2026: a stratigraphic trench is a study, the site is topography, and studies always hang off the place, off an HC1 only when the heritage is recognised.",
|
|
1522
|
+
"description": "Links an HC9 Study to the topographic place where it was carried out — the LocationNodeGroup of the site, the last link of the toponym chain (nation → region → province → comune → site), or of a saggio in the site (kind study, is_in_location the site: E.D., 11 Oct 2026), so the site finds the study going up. E.D., 10 Oct 2026: a stratigraphic trench is a study, the site is topography, and studies always hang off the place, off an HC1 only when the heritage is recognised.",
|
|
1523
1523
|
"reverse": {
|
|
1524
1524
|
"name": "was_place_of_study",
|
|
1525
1525
|
"label": "Was place of study"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"s3Dgraphy_data_model_version": "1.6.
|
|
3
|
-
"description": "v1.6.28 (MICRO lo studio usabile, decided by E.D. 2026-10-10: the stratigraphic trench is a STUDY, the site is TOPOGRAPHY, HC1 is heritage only where recognised): StudyNode gains `study_kind` (stratigraphic_excavation | survey | documentation | other) — a stratigraphic_excavation is ALSO a crmarchaeo:A9_Archaeological_Excavation, declared per value in the field (`subclass_of_by_value`, the same subclass_of form the classes use) and emitted by the RDF exporter as a second rdf:type — and `code` (the short name of the study, e.g. GT16: what the source gives, or what the user writes; never derived; the label prefix reads it). HC9 Study is aligned to crm:E65_Creation (was crm:E7_Activity; E65 ⊑ E7), HC1 Heritage Entity to crm:E70_Thing (was crm:E1_CRM_Entity), as the official HDT-O RDFS says (HDT_v2.0.1.rdf, ECHOES D7.1). The study reaches its place with study_took_place_at (crm:P7_took_place_at, connections 1.6.39). v1.6.27 (MICRO le entità spaziotemporali, decided by E.D. 2026-10-10): DocumentNode and AuthorNode (with AuthorAINode) are SPATIOTEMPORAL ENTITIES like the stratigraphic units — the top-level block `spatiotemporal_entities` names the three classes and what they share: a start and an end (absolute_time_start / absolute_time_end, read with the label of their owner: a person is born and dies, a model is released and retired), the lane of the matrix where they begin (has_first_epoch) and the ones they last through (survive_in_epoch), their place in the sequence (is_after, has_same_time), an activity. The edges are widened in connections 1.6.38; the chronology dates the three with the same rules (Graph.CHRONOLOGY_TYPES). AuthorNode and DocumentNode gain a `spatiotemporal` element saying how their time reads; no field of theirs changes. v1.6.26 (H4, decided by E.D. 5 Oct 2026, «Heriverse legge l'em.json e sceglie la versione»): ResourceNode.use admits two more uses, heriverse and aton — a version made FOR a viewer, the package on disk that Heriverse or another ATON app opens offline (EM Tools makes it with «Prepare for a use…», as is: no optimisation of its own); a viewer asks heriverse, aton, web, realtime in that order (s3dgraphy.resources.versions.choose_version). v1.6.25 (D1, MICRO un solo vocabolario, decided by E.D. 4 Oct 2026): GeoPositionNode.rotation_reference = 'grid' (D2: the rotation is measured from the GRID north of the CRS). ResourceNode.lod_level (em:lodLevel, computed from the chain, written only on export and checked at load), ResourceNode.use (em:use, a list of analysis | realtime | web | mobile_ar | print | render | preview) and seven measures of a version (em:trisPerM2, em:texelDensityDD, em:textureCount, em:textureSidePx, em:uvRatio, em:reductionFromLod0, em:geometricErrorM). v1.6.24 (dev30, decided by E.D. 2026-10-02 on the dev29 report): DTCAcquisitionNode.retrieved_from — where a retrieved object came from, a DOI or a URL (em:retrievedFrom, D1; optional, validate warns «download without origin»). ResourceNode.members_digest names em:membersDigest, the digest of a file_set with a predicate of its own beside em:checksum + em:digestCovers (D4; not a second field). ResourceNode.packaging carries its vocabulary with values and labels, translated in datamodel_translations.json (packagings; A3). ResourceNode.content_digest also holds the digest of the data of a master inside another file — a Metashape model's mesh.ply — compared, never verified by downloading (D7). GCPSetNode gains data.control (ground_control_points | camera_positions) and data.accuracy_m: a chunk referenced only by its cameras' GPS is absolute with the control said for what it is, and validate warns «georeferenced only by camera GPS» (D7). Node.properties.lang states the one explicit exception to the AI marker: a recognised language confirmed by a person is data.lang only (U5). CRMem 1.6.14. v1.6.23 (dev29, 2026-10-02, measured on San Pietro): seven properties that the round trip em.json → TTL → em.json lost now leave and come back — ResourceNode packaging / tier / digest_covers / content_digest (em:packaging, em:tier, em:digestCovers, em:contentDigest) and the declared fields of a DTC step, technique / parameters / software (em:technique, em:parameters, em:software, the last two as rdf:JSON). digest_covers admits members (a file_set). The blend:// locator stays out of RDF on purpose: it is a private path. v1.6.22 (dev28, 2026-11-01, decided by E.D. 2026-10-01 on the dev27 report): the access mode of a signature (created_auth / modified_auth / validated_auth) admits a third mode, 'declared' — an iD typed in a tool's preferences and checked by nobody (EMStudio's declared identity, EM Tools' local identity), with no attested_by; through a relay the mode is the relay's, read from the token (crdt.stamp_auth), not the client's declaration. The language a node is born in travels in the add_node op (crdt.make_op requires it of the producer, 'und' when unknown); the study's language is read only for old ops, said and counted. CRMem 1.6.12. v1.6.21 (dev27, 2026-10-31, decided by E.D. 2026-10-01, «il testo, la risorsa e la selezione» and «l'accesso sul campo»): ResourceNode.properties gains lang — on a resource the language(s) of its CONTENT, one tag or a sorted list, leaving as dcterms:language and outside the cascade of the texts — addresses (several addresses of ONE resource, same digest: em:hasAddress with em:locator, em:residency, em:checkedAt, em:reachable) and checksum_at (a dated digest, em:checksumAt). Node.properties gains created_auth / modified_auth / validated_auth: how the hand of a signature had entered, {mode: orcid | node_password, attested_by} (em:createdVia / em:modifiedVia / em:validatedVia, em:authMode, em:attestedBy). data.lang is written at birth (s3dgraphy.language.stamp_birth_language), also when equal to the study's. v1.6.20 (MICRO le traduzioni, 2026-10-29, decided by E.D. 2026-10-01, «Le traduzioni»): NEW TranslationNode (TRANSL, crm:E33_Linguistic_Object) — ONE translation of one text field of one node. The original stays a string in its field (data.lang on the node, else the study's), never overwritten; each translation is a node reached by has_translation (crm:P73_has_translation, connections 1.6.34) with data.lang (arrival), data.from_lang (departure, written because the original can change), data.field (CRDT vocabulary: description | data.<key>; a PropertyNode's value is data.value; never name), data.text, data.method (manual | ai | edition), data.source_digest (sha256 of the original translated: a different digest = «da riallineare») and data.review_requested («da rivedere»). Who: has_author; AI: data.ai_assisted, unverified until validated_by; an edition: extracted_from → the DocumentNode. RDF (em.ttl 1.6.10): Node.properties.lang names em:originalLanguage — the node's own data.lang leaves as that literal whenever it is declared, equal to the study's too, so a reader tells the original literal from the translations that share its predicate and the round trip gives data.lang back exactly where it was (the D.1 limit of 1.6.19 is closed); the TranslationNode's fields name em:sourceLanguage, em:translatedField, em:translationMethod, em:sourceDigest, em:reviewRequested. v1.6.19 (MICRO la lingua dei dati, 2026-10-27, decided by E.D. 2026-09-28): Node.properties.description becomes an object {cidoc: P3_has_note, natural_language: true, note} — the MARKER that says the description is text in a natural language and leaves in RDF with its language tag; declared once on the base class and inherited by every node type. name is NOT marked: names are invariant identities. No field added, no node element, no graph change: the em.json is the same; only the RDF literal gains its tag. v1.6.18 (MICRO i termini di em.ttl nel datamodel, 2026-10-26, decided by E.D. 2026-10-01 — the datamodel JSON is the truth, so every em: term of em.ttl is cited by a datamodel or is a written exception): the em: predicates the RDF exporter already writes are now NAMED in properties, as plain-string mapping notes (no field added, no node element, no graph change). Node (inherited by every class): the last-hand stamps created_by em:createdBy / modified_by em:lastEditedBy / modified_at em:modifiedAt (created_at prov:generatedAtTime), the tombstone removed.ts em:removedAt / removed.by em:removedBy, the AI marker ai_assisted.by em:aiAssistedBy / .model em:aiModel / .prompt_ref em:aiPromptRef / .fields em:aiAssistedField and the verification validated_by em:validatedBy / validated_at em:validatedAt (properties_note). ResourceNode: checksum em:checksum, scope em:resourceScope, residency em:residency. SemanticShapeNode: convexshapes em:convexShape, spheres em:sphere. AnnotationRegionNode: crs em:crs, coords.frame_iri em:LocalSceneFrame. AuthorNode and AuthorAINode: verified em:orcidVerified (AuthorAINode also names orcid P48, which the exporter writes for both). LocationNodeGroup.propagation.mapping: uri em:propagation. THREE ENTRIES CORRECTED TO WHAT THE CODE WRITES (measured in rdf_exporter.py): PropertyNode.property_type was P2_has_type, is em:hasQualiaType; AuthorAINode model / prompt_reference were P3_has_note, are em:modelIdentifier / em:promptReference; ResourceFileNode.checksum was P1_is_identified_by, is em:checksum; and LocationNodeGroup.propagation said 'not serialized to triplestore' while the exporter has written the non-default value as em:propagation since c1a702c (2026-08-12). v1.6.17 (MICRO la risorsa e i suoi file, 2026-10-18, decided by E.D. 2026-09-30): NEW ResourceFileNode (FILE, crmdig:D1_Digital_Object) — the ResourceNode is the set, the ResourceFileNode is each file, reached by has_file (connections 1.6.30) with role and relative path on the edge. With one file the node is implicit (url and checksum stay on the ResourceNode, as today). ResourceNode.PACKAGINGS += file_set (a few files that call each other: obj → mtl → textures, gltf → bin, shp and companions) and datablock (one object inside a file, a blend:// locator). Representations of the same thing are sibling ResourceNodes tied by dtc_derived_from and chosen by tier and packaging. ADDITIVE: nothing narrowed, no graph changes. v1.6.16 (MICRO le annotazioni ATON sull'asset, 2026-10-15, decided by E.D.): AnnotationRegionNode gains geometry_kind 'volume' — an annotation that encloses a part of a 3D model (ATON / Hathor convex hulls and spheres) and is the proxy of no unit. The region carries no vertices: it reaches a SemanticShapeNode (convexshapes, spheres) with has_semantic_shape and the model with is_on_resource. geometry.aton.import_aton_scene makes one for every semantic id no EM node is named after (a stratigraphic unit only with an explicit create_type); api.promote_region_to_proxy turns it into the proxy of a unit later. RDF: P2_has_type 'volume', no selector, no WKT; the shape travels as itself. Additive. v1.6.15 (MICRO la geometria per origine, 2026-10-11, decided by E.D. 2026-09-30): AnnotationRegionNode's point / line / polyline keep their vertices IN THE NODE, data.coords [[x, y, z], ...] (scene-local, glTF Y-up, metres) with crs and, for a line or a polyline, length and unit — no .glb and no SemanticShape for a reading. New block coords (inline_max_vertices 500: above it the vertices go to a .glb resource via has_linked_resource, with a warning). RDF: geo:hasGeometry -> <region>/geometry geo:asWKT (POINT Z / LINESTRING Z, GeoSPARQL). The readings/<id>.glb of 2026-10-06 are migrated on opening. v1.6.14 (MICRO la cattura in RDF, 2026-09-30): DTCAcquisitionNode.mapping.by_kind — its D12 is the class of a retrieval; a capture takes the class its kind declares in em_visual_rules 1.6.24 (D2 / D11 / E65). Mapping text only, no field changed. v1.6.13 (MICRO i generi delle US, 2026-09-30, decided by E.D. the same day): stratigraphic_kind gains 'coating' — the USR (rivestimento) and its English translation USS (surface): plaster, floors, revetments — with `labels`, `codes` and `default_code` per kind; new node element `source_code` (data.source_code) keeps the code a unit came in with when it is not its kind's default, so the way back to pyArchInit gives the same code. A legacy node_type 'USR' / 'USS' opens as US + coating. v1.6.12 (MICRO la cattura nel DTC e le murature, 2026-09-30): StratigraphicUnit (US) gains the node element `stratigraphic_kind` (em.json data.stratigraphic_kind; today one value, 'masonry'): a USM is a US + masonry, and the legacy node_type 'USM' — never a type of this datamodel — opens as that. DTCAcquisitionNode's description names the two families of the acquisition axis (em_visual_rules 1.6.22: capture / retrieval). v1.6.11 (MICRO la misura in RDF, 2026-10-07): AnnotationRegionNode.properties says how the fields left unprojected by 1.6.10 now travel — the quote of a passage as oa:TextQuoteSelector, the length of a line/polyline as crm:E54_Dimension (P90 value, P91 QUDT unit, em:crs), vertex_count as em:vertexCount. CRMem (em.ttl) 1.6.5 -> 1.6.6. Mapping text only, no field changed. v1.6.10 (MICRO la geometria della lettura, 2026-10-06, decided by E.D. on 2026-09-29): AnnotationRegionNode becomes the node of THE PLACE A READING LOOKED AT, with a new field geometry_kind: region2d (default, every older region), passage (start, end, text), point, line, polyline. The three 3D kinds keep their coordinates in a .glb (glTF POINTS / LINES / LINE_STRIP) linked with has_semantic_shape exactly like a proxy's payload, never in the em.json; the node keeps vertex_count and, for line/polyline, length + unit + crs (api.measure). See the entry's geometry_kinds and glb_payload. Paired with connections 1.6.27 (is_on_resource.target += the representation models). Additive: a region without geometry_kind reads as region2d. v1.6.9 (MICRO la definizione dell'unita', 2026-10-20, decided by E.D. on 2026-09-27): StratigraphicNode.properties gains `definition`, the DEFINIZIONE of the US sheet, as an element of the node like name and description and NOT a qualia. Value = a controlled-vocabulary concept {concept, label}; em.json carries it as data.definition (CRDT field 'data.definition', no change to the frozen em.json v1 node shape); inherited by every stratigraphic subtype. The RDF projection is declared in the entry itself (`rdf`): crm:P2_has_type -> crm:E55_Type when a concept URI is present, nothing when only a label is (`label_only: null`). CRMem 1.6.4 -> 1.6.5 for the companion em:hasDefinition (subproperty of crm:P2_has_type, declared, not emitted by default). Additive only. v1.6.7 (CRMem WIRING, 2026-09-24): rimosso il campo legacy `cidoc_s3d` da tutte le mapping. Non era letto da nessuna parte del codice e portava quattro nomi di classe senza namespace, mai dichiarati e mai emessi: EpochNode = StratigraphicTimeframe; ActivityNodeGroup = StratigraphicActivity; ParadataNodeGroup = ParadataCollection; ResourceNode = ExternalResourceReference. Il prefisso CIDOC-S3D non esiste piu' in nessuno dei due datamodel. v1.6.6 (CIDOC REPAIR, 2026-09-21): classes that pointed at IRIs nobody declares. Checked by parsing the official releases, not from memory. crm:E78_Collection is gone from CIDOC CRM 7.1.3 — renamed E78_Curated_Holding — and E.D. decided NOT to follow the rename, because E78_Curated_Holding is a subclass of E24 Physical Human-Made Thing and a group of nodes is not a physical thing. The three classes that carried it therefore split, each to the class it actually is: GroupNode and RepresentationModelNodeGroup to crm:E73_Information_Object (a conceptual set, and an E90 Symbolic Object, which is what the P106i membership edge needs at both ends), ParadataNodeGroup to crm:E89_Propositional_Object — which is what a gathered body of reasoning IS and what the range of crm:P129i_is_subject_of demands, that being the predicate has_paradata_nodegroup takes in connections 1.6.17 the same day; it stays an E90 through em:NodeGroup, so the membership edge does not break. SemanticShapeNode leaves crmgeo:SP5_Geometric_Place_Expression for crm:E73_Information_Object, PROVVISORIAMENTE: SP5 is not declared at the crmgeo namespace this datamodel emits, crmgeo:SP6_Declarative_Place is the better candidate, and the decision is rinviata da E.D. — E73 commits to nothing meanwhile. crm:P131_is_identified_by, deprecated in CRM 7.x together with E82 Actor Appellation, becomes crm:P1_is_identified_by on AuthorNode (name, surname) and AuthorAINode (name). «CRMs3D» is renamed «CRMem», in components and in referenced_ontology_versions alike: the companion ontology is em.ttl and its namespace is em:, so the old name pointed at nothing anyone could look up. CRMsci moves 3.1 -> 3.2 (latest release). The eight em: terms this file and the connections datamodel cite but em.ttl never defined are now declared there (em:FunctionalUnit, em:GCPSet, em:Narrative, em:NeutralSU, em:RegistrationTransform, em:RepresentationModelNodeGroup, em:hasSubEpoch, em:validatedBy), with domain, range and superclass read off these datamodels and nothing invented. NOT TOUCHED: the `alternative` and legacy `cidoc_s3d` prose fields, which still discuss E78 as an option — prose, not a projection, and rewording them is modelling rather than repair. v1.6.5 (EM16-RMNG, 2026-09-10): adds RepresentationModelNodeGroup, the RM container as a first-class group of the graph — sixth subtype of GroupNode, keeping the parent's E78 Collection because a container IS a curatorial set. Paired with connections datamodel 1.6.14, which adds the is_in_representation_model_group membership edge and widens has_representation_model.target to accept the group. Additive only: no existing entry changed. s3Dgraphy nodes datamodel including node types with CIDOC-CRM mappings. v1.6.4 adds the ADDITIVE georeferencing_nodes section (GCPSetNode = em:GCPSet, RegistrationTransformNode = em:RegistrationTransform, both subclasses of crm:E73_Information_Object with their own extension URIs so the RDF projection stays bijective): the CONTROL and the SOLUTION that place a produced model in the world, introduced with the photogrammetry processing connector. The two modes of that connector are the SHAPE of the graph (a transform with a CRS that has_gcp_set points at = absolute; a transform with crs=null and no control set = a site-local frame; no transform at all = nobody placed it), never a flag. No existing family changed. v1.6.3 re-reads SemanticShapeNode as a PAYLOAD carrier: the proxy of a unit is now a PropertyNode of qualia type 'geometry' that points at the shape (has_semantic_shape), so the proxy inherits the paradata chain it never had. Breaking for consumers that read the proxy as a standalone SemanticShape. v1.6.2 adds AnnotationRegionNode (em:AnnotationRegion, subclass of crm:E36_Visual_Item): the geometry of a 2D annotation in NORMALISED image space, distinct from SemanticShapeNode (3D scene geometry, crmgeo:SP5) - the semantics of the 2D annotator, defined before any canvas exists. v1.6.0 inaugurates a systematic CIDOC-CRM mapping revision: complete audit of all node types against CIDOC-CRM, CRMarchaeo, CRMinf, CRMdig, CRMsci, CRMgeo; replacement of legacy 'cidoc_s3d' pseudo-class names (invented strings without IRI or superclass declaration) with formal em:/s3d: IRIs declared as proper subclasses of CRM classes; introduction of CRMinf as primary (not alternative) for the paradata chain (ParadataNode, PropertyNode interpretive case, ExtractorNode, CombinerNode); introduction of PROV-O for AuthorNode to cover both human and AI agents; alignment with the Heritage Digital Twin Ontology (HDT-O) for containment / granularity properties; LocationNodeGroup (v1.5.3) adopted as the reference pattern (CIDOC-native composition via P2_has_type → E55 Type instances, with explicit extension_status and rationale). Companion deliverables: em.ttl (formal EM extension ontology, dereferenceable via w3id.org/em/) and hdto_extension.ttl (HDT-O granularity properties: contains_HDT, contains_SU, isPrimary). v1.5.4 added RSF (Reused Special Find — spolia) as a stratigraphic subtype, octagon with red border, family=real, is_series=false. Originating DP: DP-26 (spolia project, last DP before the EM 1.5 cut). v1.5.3 added LocationNodeGroup (E53 Place + E55 Type) for spatial / locational membership orthogonal to ActivityNodeGroup (intention) and EpochNode (time). v1.5.2 added family + is_series classification metadata on stratigraphic subtypes.",
|
|
2
|
+
"s3Dgraphy_data_model_version": "1.6.30",
|
|
3
|
+
"description": "v1.6.30 (giro dell'11 ottobre (2), decided by E.D. 2026-10-11, «il codice di studio è stabile»): StudyNode.code is STABLE — once a study has one it never changes by itself (import, export, migration, projection): it is what Blender re-attaches the proxies by (GT16.1.USM100). Read: the study's code, else the GraphML header ID (graph_code), else the retired em_id (read only). A GraphML's header ID is written on the study at import. When there is none, s3dgraphy.hdto.propose_study_code writes ONE proposal (site initials + the year of the study's date, -2/-3 against the other codes of the container) and marks it with the new field `code_proposed` until the user confirms it. v1.6.29 (giro dell'11 ottobre, decided by E.D. 2026-10-11): the code of a graph is the code of its STUDY — StudyNode.code replaces the graph-self node's retired «EM-ID» (GraphNode.data.em_id, never a field of this datamodel): a file that has one keeps it and s3dgraphy.hdto.migrate_em_id carries it to the study's code only when the study exists and has none. A saggio is a study AND a place: its LocationNodeGroup (kind study) is in the site (is_in_location), the study took place at it. Descriptions only, no field added. v1.6.28 (MICRO lo studio usabile, decided by E.D. 2026-10-10: the stratigraphic trench is a STUDY, the site is TOPOGRAPHY, HC1 is heritage only where recognised): StudyNode gains `study_kind` (stratigraphic_excavation | survey | documentation | other) — a stratigraphic_excavation is ALSO a crmarchaeo:A9_Archaeological_Excavation, declared per value in the field (`subclass_of_by_value`, the same subclass_of form the classes use) and emitted by the RDF exporter as a second rdf:type — and `code` (the short name of the study, e.g. GT16: what the source gives, or what the user writes; never derived; the label prefix reads it). HC9 Study is aligned to crm:E65_Creation (was crm:E7_Activity; E65 ⊑ E7), HC1 Heritage Entity to crm:E70_Thing (was crm:E1_CRM_Entity), as the official HDT-O RDFS says (HDT_v2.0.1.rdf, ECHOES D7.1). The study reaches its place with study_took_place_at (crm:P7_took_place_at, connections 1.6.39). v1.6.27 (MICRO le entità spaziotemporali, decided by E.D. 2026-10-10): DocumentNode and AuthorNode (with AuthorAINode) are SPATIOTEMPORAL ENTITIES like the stratigraphic units — the top-level block `spatiotemporal_entities` names the three classes and what they share: a start and an end (absolute_time_start / absolute_time_end, read with the label of their owner: a person is born and dies, a model is released and retired), the lane of the matrix where they begin (has_first_epoch) and the ones they last through (survive_in_epoch), their place in the sequence (is_after, has_same_time), an activity. The edges are widened in connections 1.6.38; the chronology dates the three with the same rules (Graph.CHRONOLOGY_TYPES). AuthorNode and DocumentNode gain a `spatiotemporal` element saying how their time reads; no field of theirs changes. v1.6.26 (H4, decided by E.D. 5 Oct 2026, «Heriverse legge l'em.json e sceglie la versione»): ResourceNode.use admits two more uses, heriverse and aton — a version made FOR a viewer, the package on disk that Heriverse or another ATON app opens offline (EM Tools makes it with «Prepare for a use…», as is: no optimisation of its own); a viewer asks heriverse, aton, web, realtime in that order (s3dgraphy.resources.versions.choose_version). v1.6.25 (D1, MICRO un solo vocabolario, decided by E.D. 4 Oct 2026): GeoPositionNode.rotation_reference = 'grid' (D2: the rotation is measured from the GRID north of the CRS). ResourceNode.lod_level (em:lodLevel, computed from the chain, written only on export and checked at load), ResourceNode.use (em:use, a list of analysis | realtime | web | mobile_ar | print | render | preview) and seven measures of a version (em:trisPerM2, em:texelDensityDD, em:textureCount, em:textureSidePx, em:uvRatio, em:reductionFromLod0, em:geometricErrorM). v1.6.24 (dev30, decided by E.D. 2026-10-02 on the dev29 report): DTCAcquisitionNode.retrieved_from — where a retrieved object came from, a DOI or a URL (em:retrievedFrom, D1; optional, validate warns «download without origin»). ResourceNode.members_digest names em:membersDigest, the digest of a file_set with a predicate of its own beside em:checksum + em:digestCovers (D4; not a second field). ResourceNode.packaging carries its vocabulary with values and labels, translated in datamodel_translations.json (packagings; A3). ResourceNode.content_digest also holds the digest of the data of a master inside another file — a Metashape model's mesh.ply — compared, never verified by downloading (D7). GCPSetNode gains data.control (ground_control_points | camera_positions) and data.accuracy_m: a chunk referenced only by its cameras' GPS is absolute with the control said for what it is, and validate warns «georeferenced only by camera GPS» (D7). Node.properties.lang states the one explicit exception to the AI marker: a recognised language confirmed by a person is data.lang only (U5). CRMem 1.6.14. v1.6.23 (dev29, 2026-10-02, measured on San Pietro): seven properties that the round trip em.json → TTL → em.json lost now leave and come back — ResourceNode packaging / tier / digest_covers / content_digest (em:packaging, em:tier, em:digestCovers, em:contentDigest) and the declared fields of a DTC step, technique / parameters / software (em:technique, em:parameters, em:software, the last two as rdf:JSON). digest_covers admits members (a file_set). The blend:// locator stays out of RDF on purpose: it is a private path. v1.6.22 (dev28, 2026-11-01, decided by E.D. 2026-10-01 on the dev27 report): the access mode of a signature (created_auth / modified_auth / validated_auth) admits a third mode, 'declared' — an iD typed in a tool's preferences and checked by nobody (EMStudio's declared identity, EM Tools' local identity), with no attested_by; through a relay the mode is the relay's, read from the token (crdt.stamp_auth), not the client's declaration. The language a node is born in travels in the add_node op (crdt.make_op requires it of the producer, 'und' when unknown); the study's language is read only for old ops, said and counted. CRMem 1.6.12. v1.6.21 (dev27, 2026-10-31, decided by E.D. 2026-10-01, «il testo, la risorsa e la selezione» and «l'accesso sul campo»): ResourceNode.properties gains lang — on a resource the language(s) of its CONTENT, one tag or a sorted list, leaving as dcterms:language and outside the cascade of the texts — addresses (several addresses of ONE resource, same digest: em:hasAddress with em:locator, em:residency, em:checkedAt, em:reachable) and checksum_at (a dated digest, em:checksumAt). Node.properties gains created_auth / modified_auth / validated_auth: how the hand of a signature had entered, {mode: orcid | node_password, attested_by} (em:createdVia / em:modifiedVia / em:validatedVia, em:authMode, em:attestedBy). data.lang is written at birth (s3dgraphy.language.stamp_birth_language), also when equal to the study's. v1.6.20 (MICRO le traduzioni, 2026-10-29, decided by E.D. 2026-10-01, «Le traduzioni»): NEW TranslationNode (TRANSL, crm:E33_Linguistic_Object) — ONE translation of one text field of one node. The original stays a string in its field (data.lang on the node, else the study's), never overwritten; each translation is a node reached by has_translation (crm:P73_has_translation, connections 1.6.34) with data.lang (arrival), data.from_lang (departure, written because the original can change), data.field (CRDT vocabulary: description | data.<key>; a PropertyNode's value is data.value; never name), data.text, data.method (manual | ai | edition), data.source_digest (sha256 of the original translated: a different digest = «da riallineare») and data.review_requested («da rivedere»). Who: has_author; AI: data.ai_assisted, unverified until validated_by; an edition: extracted_from → the DocumentNode. RDF (em.ttl 1.6.10): Node.properties.lang names em:originalLanguage — the node's own data.lang leaves as that literal whenever it is declared, equal to the study's too, so a reader tells the original literal from the translations that share its predicate and the round trip gives data.lang back exactly where it was (the D.1 limit of 1.6.19 is closed); the TranslationNode's fields name em:sourceLanguage, em:translatedField, em:translationMethod, em:sourceDigest, em:reviewRequested. v1.6.19 (MICRO la lingua dei dati, 2026-10-27, decided by E.D. 2026-09-28): Node.properties.description becomes an object {cidoc: P3_has_note, natural_language: true, note} — the MARKER that says the description is text in a natural language and leaves in RDF with its language tag; declared once on the base class and inherited by every node type. name is NOT marked: names are invariant identities. No field added, no node element, no graph change: the em.json is the same; only the RDF literal gains its tag. v1.6.18 (MICRO i termini di em.ttl nel datamodel, 2026-10-26, decided by E.D. 2026-10-01 — the datamodel JSON is the truth, so every em: term of em.ttl is cited by a datamodel or is a written exception): the em: predicates the RDF exporter already writes are now NAMED in properties, as plain-string mapping notes (no field added, no node element, no graph change). Node (inherited by every class): the last-hand stamps created_by em:createdBy / modified_by em:lastEditedBy / modified_at em:modifiedAt (created_at prov:generatedAtTime), the tombstone removed.ts em:removedAt / removed.by em:removedBy, the AI marker ai_assisted.by em:aiAssistedBy / .model em:aiModel / .prompt_ref em:aiPromptRef / .fields em:aiAssistedField and the verification validated_by em:validatedBy / validated_at em:validatedAt (properties_note). ResourceNode: checksum em:checksum, scope em:resourceScope, residency em:residency. SemanticShapeNode: convexshapes em:convexShape, spheres em:sphere. AnnotationRegionNode: crs em:crs, coords.frame_iri em:LocalSceneFrame. AuthorNode and AuthorAINode: verified em:orcidVerified (AuthorAINode also names orcid P48, which the exporter writes for both). LocationNodeGroup.propagation.mapping: uri em:propagation. THREE ENTRIES CORRECTED TO WHAT THE CODE WRITES (measured in rdf_exporter.py): PropertyNode.property_type was P2_has_type, is em:hasQualiaType; AuthorAINode model / prompt_reference were P3_has_note, are em:modelIdentifier / em:promptReference; ResourceFileNode.checksum was P1_is_identified_by, is em:checksum; and LocationNodeGroup.propagation said 'not serialized to triplestore' while the exporter has written the non-default value as em:propagation since c1a702c (2026-08-12). v1.6.17 (MICRO la risorsa e i suoi file, 2026-10-18, decided by E.D. 2026-09-30): NEW ResourceFileNode (FILE, crmdig:D1_Digital_Object) — the ResourceNode is the set, the ResourceFileNode is each file, reached by has_file (connections 1.6.30) with role and relative path on the edge. With one file the node is implicit (url and checksum stay on the ResourceNode, as today). ResourceNode.PACKAGINGS += file_set (a few files that call each other: obj → mtl → textures, gltf → bin, shp and companions) and datablock (one object inside a file, a blend:// locator). Representations of the same thing are sibling ResourceNodes tied by dtc_derived_from and chosen by tier and packaging. ADDITIVE: nothing narrowed, no graph changes. v1.6.16 (MICRO le annotazioni ATON sull'asset, 2026-10-15, decided by E.D.): AnnotationRegionNode gains geometry_kind 'volume' — an annotation that encloses a part of a 3D model (ATON / Hathor convex hulls and spheres) and is the proxy of no unit. The region carries no vertices: it reaches a SemanticShapeNode (convexshapes, spheres) with has_semantic_shape and the model with is_on_resource. geometry.aton.import_aton_scene makes one for every semantic id no EM node is named after (a stratigraphic unit only with an explicit create_type); api.promote_region_to_proxy turns it into the proxy of a unit later. RDF: P2_has_type 'volume', no selector, no WKT; the shape travels as itself. Additive. v1.6.15 (MICRO la geometria per origine, 2026-10-11, decided by E.D. 2026-09-30): AnnotationRegionNode's point / line / polyline keep their vertices IN THE NODE, data.coords [[x, y, z], ...] (scene-local, glTF Y-up, metres) with crs and, for a line or a polyline, length and unit — no .glb and no SemanticShape for a reading. New block coords (inline_max_vertices 500: above it the vertices go to a .glb resource via has_linked_resource, with a warning). RDF: geo:hasGeometry -> <region>/geometry geo:asWKT (POINT Z / LINESTRING Z, GeoSPARQL). The readings/<id>.glb of 2026-10-06 are migrated on opening. v1.6.14 (MICRO la cattura in RDF, 2026-09-30): DTCAcquisitionNode.mapping.by_kind — its D12 is the class of a retrieval; a capture takes the class its kind declares in em_visual_rules 1.6.24 (D2 / D11 / E65). Mapping text only, no field changed. v1.6.13 (MICRO i generi delle US, 2026-09-30, decided by E.D. the same day): stratigraphic_kind gains 'coating' — the USR (rivestimento) and its English translation USS (surface): plaster, floors, revetments — with `labels`, `codes` and `default_code` per kind; new node element `source_code` (data.source_code) keeps the code a unit came in with when it is not its kind's default, so the way back to pyArchInit gives the same code. A legacy node_type 'USR' / 'USS' opens as US + coating. v1.6.12 (MICRO la cattura nel DTC e le murature, 2026-09-30): StratigraphicUnit (US) gains the node element `stratigraphic_kind` (em.json data.stratigraphic_kind; today one value, 'masonry'): a USM is a US + masonry, and the legacy node_type 'USM' — never a type of this datamodel — opens as that. DTCAcquisitionNode's description names the two families of the acquisition axis (em_visual_rules 1.6.22: capture / retrieval). v1.6.11 (MICRO la misura in RDF, 2026-10-07): AnnotationRegionNode.properties says how the fields left unprojected by 1.6.10 now travel — the quote of a passage as oa:TextQuoteSelector, the length of a line/polyline as crm:E54_Dimension (P90 value, P91 QUDT unit, em:crs), vertex_count as em:vertexCount. CRMem (em.ttl) 1.6.5 -> 1.6.6. Mapping text only, no field changed. v1.6.10 (MICRO la geometria della lettura, 2026-10-06, decided by E.D. on 2026-09-29): AnnotationRegionNode becomes the node of THE PLACE A READING LOOKED AT, with a new field geometry_kind: region2d (default, every older region), passage (start, end, text), point, line, polyline. The three 3D kinds keep their coordinates in a .glb (glTF POINTS / LINES / LINE_STRIP) linked with has_semantic_shape exactly like a proxy's payload, never in the em.json; the node keeps vertex_count and, for line/polyline, length + unit + crs (api.measure). See the entry's geometry_kinds and glb_payload. Paired with connections 1.6.27 (is_on_resource.target += the representation models). Additive: a region without geometry_kind reads as region2d. v1.6.9 (MICRO la definizione dell'unita', 2026-10-20, decided by E.D. on 2026-09-27): StratigraphicNode.properties gains `definition`, the DEFINIZIONE of the US sheet, as an element of the node like name and description and NOT a qualia. Value = a controlled-vocabulary concept {concept, label}; em.json carries it as data.definition (CRDT field 'data.definition', no change to the frozen em.json v1 node shape); inherited by every stratigraphic subtype. The RDF projection is declared in the entry itself (`rdf`): crm:P2_has_type -> crm:E55_Type when a concept URI is present, nothing when only a label is (`label_only: null`). CRMem 1.6.4 -> 1.6.5 for the companion em:hasDefinition (subproperty of crm:P2_has_type, declared, not emitted by default). Additive only. v1.6.7 (CRMem WIRING, 2026-09-24): rimosso il campo legacy `cidoc_s3d` da tutte le mapping. Non era letto da nessuna parte del codice e portava quattro nomi di classe senza namespace, mai dichiarati e mai emessi: EpochNode = StratigraphicTimeframe; ActivityNodeGroup = StratigraphicActivity; ParadataNodeGroup = ParadataCollection; ResourceNode = ExternalResourceReference. Il prefisso CIDOC-S3D non esiste piu' in nessuno dei due datamodel. v1.6.6 (CIDOC REPAIR, 2026-09-21): classes that pointed at IRIs nobody declares. Checked by parsing the official releases, not from memory. crm:E78_Collection is gone from CIDOC CRM 7.1.3 — renamed E78_Curated_Holding — and E.D. decided NOT to follow the rename, because E78_Curated_Holding is a subclass of E24 Physical Human-Made Thing and a group of nodes is not a physical thing. The three classes that carried it therefore split, each to the class it actually is: GroupNode and RepresentationModelNodeGroup to crm:E73_Information_Object (a conceptual set, and an E90 Symbolic Object, which is what the P106i membership edge needs at both ends), ParadataNodeGroup to crm:E89_Propositional_Object — which is what a gathered body of reasoning IS and what the range of crm:P129i_is_subject_of demands, that being the predicate has_paradata_nodegroup takes in connections 1.6.17 the same day; it stays an E90 through em:NodeGroup, so the membership edge does not break. SemanticShapeNode leaves crmgeo:SP5_Geometric_Place_Expression for crm:E73_Information_Object, PROVVISORIAMENTE: SP5 is not declared at the crmgeo namespace this datamodel emits, crmgeo:SP6_Declarative_Place is the better candidate, and the decision is rinviata da E.D. — E73 commits to nothing meanwhile. crm:P131_is_identified_by, deprecated in CRM 7.x together with E82 Actor Appellation, becomes crm:P1_is_identified_by on AuthorNode (name, surname) and AuthorAINode (name). «CRMs3D» is renamed «CRMem», in components and in referenced_ontology_versions alike: the companion ontology is em.ttl and its namespace is em:, so the old name pointed at nothing anyone could look up. CRMsci moves 3.1 -> 3.2 (latest release). The eight em: terms this file and the connections datamodel cite but em.ttl never defined are now declared there (em:FunctionalUnit, em:GCPSet, em:Narrative, em:NeutralSU, em:RegistrationTransform, em:RepresentationModelNodeGroup, em:hasSubEpoch, em:validatedBy), with domain, range and superclass read off these datamodels and nothing invented. NOT TOUCHED: the `alternative` and legacy `cidoc_s3d` prose fields, which still discuss E78 as an option — prose, not a projection, and rewording them is modelling rather than repair. v1.6.5 (EM16-RMNG, 2026-09-10): adds RepresentationModelNodeGroup, the RM container as a first-class group of the graph — sixth subtype of GroupNode, keeping the parent's E78 Collection because a container IS a curatorial set. Paired with connections datamodel 1.6.14, which adds the is_in_representation_model_group membership edge and widens has_representation_model.target to accept the group. Additive only: no existing entry changed. s3Dgraphy nodes datamodel including node types with CIDOC-CRM mappings. v1.6.4 adds the ADDITIVE georeferencing_nodes section (GCPSetNode = em:GCPSet, RegistrationTransformNode = em:RegistrationTransform, both subclasses of crm:E73_Information_Object with their own extension URIs so the RDF projection stays bijective): the CONTROL and the SOLUTION that place a produced model in the world, introduced with the photogrammetry processing connector. The two modes of that connector are the SHAPE of the graph (a transform with a CRS that has_gcp_set points at = absolute; a transform with crs=null and no control set = a site-local frame; no transform at all = nobody placed it), never a flag. No existing family changed. v1.6.3 re-reads SemanticShapeNode as a PAYLOAD carrier: the proxy of a unit is now a PropertyNode of qualia type 'geometry' that points at the shape (has_semantic_shape), so the proxy inherits the paradata chain it never had. Breaking for consumers that read the proxy as a standalone SemanticShape. v1.6.2 adds AnnotationRegionNode (em:AnnotationRegion, subclass of crm:E36_Visual_Item): the geometry of a 2D annotation in NORMALISED image space, distinct from SemanticShapeNode (3D scene geometry, crmgeo:SP5) - the semantics of the 2D annotator, defined before any canvas exists. v1.6.0 inaugurates a systematic CIDOC-CRM mapping revision: complete audit of all node types against CIDOC-CRM, CRMarchaeo, CRMinf, CRMdig, CRMsci, CRMgeo; replacement of legacy 'cidoc_s3d' pseudo-class names (invented strings without IRI or superclass declaration) with formal em:/s3d: IRIs declared as proper subclasses of CRM classes; introduction of CRMinf as primary (not alternative) for the paradata chain (ParadataNode, PropertyNode interpretive case, ExtractorNode, CombinerNode); introduction of PROV-O for AuthorNode to cover both human and AI agents; alignment with the Heritage Digital Twin Ontology (HDT-O) for containment / granularity properties; LocationNodeGroup (v1.5.3) adopted as the reference pattern (CIDOC-native composition via P2_has_type → E55 Type instances, with explicit extension_status and rationale). Companion deliverables: em.ttl (formal EM extension ontology, dereferenceable via w3id.org/em/) and hdto_extension.ttl (HDT-O granularity properties: contains_HDT, contains_SU, isPrimary). v1.5.4 added RSF (Reused Special Find — spolia) as a stratigraphic subtype, octagon with red border, family=real, is_series=false. Originating DP: DP-26 (spolia project, last DP before the EM 1.5 cut). v1.5.3 added LocationNodeGroup (E53 Place + E55 Type) for spatial / locational membership orthogonal to ActivityNodeGroup (intention) and EpochNode (time). v1.5.2 added family + is_series classification metadata on stratigraphic subtypes.",
|
|
4
4
|
"components": [
|
|
5
5
|
"CIDOC-CRM",
|
|
6
6
|
"CRMarchaeo",
|
|
@@ -808,7 +808,7 @@
|
|
|
808
808
|
"functional"
|
|
809
809
|
],
|
|
810
810
|
"required": true,
|
|
811
|
-
"description": "Epistemic plane of the location. 'toponym' = external/administrative identity (Pompei, Lazio, Italia); 'study' = operational/procedural identity (saggio, settore, quadrato, sondage); 'functional' = interpretive/semantic identity (basilica, room A, courtyard). The three coexist on the same node and may compose.",
|
|
811
|
+
"description": "Epistemic plane of the location. 'toponym' = external/administrative identity (Pompei, Lazio, Italia); 'study' = operational/procedural identity (saggio, settore, quadrato, sondage) — a saggio is in its site (is_in_location) and is the place its StudyNode took place at (E.D., 11 Oct 2026); 'functional' = interpretive/semantic identity (basilica, room A, courtyard). The three coexist on the same node and may compose.",
|
|
812
812
|
"mapping": {
|
|
813
813
|
"cidoc": "P2_has_type → E55 Type",
|
|
814
814
|
"pattern": "The E53 Place is classified via P2_has_type by exactly one of three reserved E55 Type instances. CIDOC-native composition; no new property URI is introduced.",
|
|
@@ -1713,11 +1713,19 @@
|
|
|
1713
1713
|
"code": {
|
|
1714
1714
|
"type": "string",
|
|
1715
1715
|
"required": false,
|
|
1716
|
-
"description": "The short name of the study (GT16, TM16): the
|
|
1716
|
+
"description": "The short name of the study (GT16, TM16), STABLE (E.D., 11 Oct 2026): the prefix Blender re-attaches the proxies by (GT16.1.USM100), so once written it never changes by itself — import, export, migration, projection. Sources, in order: the code the source gives (pyArchInit); the GraphML header ID, reused as it is (written here at import, and still kept in graph.attributes['graph_code'] and GraphNode.data.em_id); a file's retired em_id (s3dgraphy.hdto.migrate_em_id; s3dgraphy.hdto.study_code reads it as a fallback without writing). When none exists, a proposal is written ONCE (s3dgraphy.hdto.propose_study_code) and marked with code_proposed until the user confirms it.",
|
|
1717
1717
|
"mapping": {
|
|
1718
1718
|
"cidoc": "P1_is_identified_by"
|
|
1719
1719
|
}
|
|
1720
1720
|
},
|
|
1721
|
+
"code_proposed": {
|
|
1722
|
+
"type": "boolean",
|
|
1723
|
+
"required": false,
|
|
1724
|
+
"description": "True while the study's code is a PROPOSAL of the system (E.D., 11 Oct 2026: Blender needs unique proxy names, so a study without a code gets one — the site's initials and the year, unique in the container). Written once with the code and never recomputed; it goes away when the user confirms the code (s3dgraphy.hdto.confirm_study_code), who may then also replace the proposal. Absent = the code was given, not proposed.",
|
|
1725
|
+
"mapping": {
|
|
1726
|
+
"cidoc": null
|
|
1727
|
+
}
|
|
1728
|
+
},
|
|
1721
1729
|
"disciplinary_focus": {
|
|
1722
1730
|
"type": "string",
|
|
1723
1731
|
"required": false,
|
|
@@ -673,17 +673,75 @@ def graphs_about(container, entity) -> List[str]:
|
|
|
673
673
|
|
|
674
674
|
|
|
675
675
|
def study_code(graph: Graph) -> Optional[str]:
|
|
676
|
-
"""The study's short name (GT16): ``StudyNode.data.code``, else the
|
|
677
|
-
GraphML's header ID,
|
|
676
|
+
"""The study's short name (GT16), stable: ``StudyNode.data.code``, else the
|
|
677
|
+
GraphML's header ID, else the retired em_id (read only). Never writes,
|
|
678
|
+
never proposes. See :func:`s3dgraphy.hdto.study_code`."""
|
|
678
679
|
from .hdto import study_code as _code
|
|
679
680
|
return _code(graph)
|
|
680
681
|
|
|
681
682
|
|
|
682
|
-
def
|
|
683
|
-
"""
|
|
684
|
-
|
|
683
|
+
def propose_study_code(graph: Graph, container=None) -> Dict[str, Any]:
|
|
684
|
+
"""Give the study a code when it has none — once, marked
|
|
685
|
+
``data.code_proposed`` until :func:`confirm_study_code`; never recomputed.
|
|
686
|
+
``container`` avoids the codes of its other graphs. See
|
|
687
|
+
:func:`s3dgraphy.hdto.propose_study_code`."""
|
|
688
|
+
from .hdto import propose_study_code as _propose
|
|
689
|
+
return _propose(graph, container)
|
|
690
|
+
|
|
691
|
+
|
|
692
|
+
def is_code_proposed(graph: Graph) -> bool:
|
|
693
|
+
"""Whether the study's code is a proposal not yet confirmed."""
|
|
694
|
+
from .hdto import is_code_proposed as _is
|
|
695
|
+
return _is(graph)
|
|
696
|
+
|
|
697
|
+
|
|
698
|
+
def confirm_study_code(graph: Graph, code: Optional[str] = None) -> Optional[str]:
|
|
699
|
+
"""The user confirms the proposed code (or replaces the PROPOSAL with
|
|
700
|
+
``code``); a confirmed code is not changed by confirming."""
|
|
701
|
+
from .hdto import confirm_study_code as _confirm
|
|
702
|
+
return _confirm(graph, code)
|
|
703
|
+
|
|
704
|
+
|
|
705
|
+
def migrate_em_id(graph: Graph) -> Dict[str, Any]:
|
|
706
|
+
"""The retired ``GraphNode.data.em_id`` → ``StudyNode.data.code``, only
|
|
707
|
+
when the study exists and has no code; the em_id is kept, nothing is
|
|
708
|
+
invented. See :func:`s3dgraphy.hdto.migrate_em_id`."""
|
|
709
|
+
from .hdto import migrate_em_id as _migrate
|
|
710
|
+
return _migrate(graph)
|
|
711
|
+
|
|
712
|
+
|
|
713
|
+
def unit_label(graph: Graph, name: str, separator: str = ".", *,
|
|
714
|
+
container=None, propose: bool = True) -> str:
|
|
715
|
+
"""A unit's name with the study's code as prefix (GT16.US001). Without a
|
|
716
|
+
code, one is proposed and written first (once); ``propose=False`` gives
|
|
717
|
+
the name as it is."""
|
|
685
718
|
from .hdto import unit_label as _label
|
|
686
|
-
return _label(graph, name, separator)
|
|
719
|
+
return _label(graph, name, separator, container=container, propose=propose)
|
|
720
|
+
|
|
721
|
+
|
|
722
|
+
# ── rapporti between the graphs of one em.json (11 Oct 2026) ─────────────────
|
|
723
|
+
def add_link(container, source, target, edge_type: str, *,
|
|
724
|
+
link_id: Optional[str] = None,
|
|
725
|
+
attributes: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
|
|
726
|
+
"""A rapporto from ``(graph_id, node_id)`` to ``(graph_id, node_id)`` of
|
|
727
|
+
another graph of ``container``. See :mod:`s3dgraphy.links`."""
|
|
728
|
+
from .links import add_link as _add
|
|
729
|
+
return _add(container, source, target, edge_type, link_id=link_id,
|
|
730
|
+
attributes=attributes)
|
|
731
|
+
|
|
732
|
+
|
|
733
|
+
def links_of(container, graph_id: str,
|
|
734
|
+
node_id: Optional[str] = None) -> List[Dict[str, Any]]:
|
|
735
|
+
"""Every rapporto touching a graph (or one of its nodes), both ways, with
|
|
736
|
+
the address of the other end to navigate to."""
|
|
737
|
+
from .links import links_of as _of
|
|
738
|
+
return _of(container, graph_id, node_id)
|
|
739
|
+
|
|
740
|
+
|
|
741
|
+
def linked_graphs(container, graph_id: str) -> List[str]:
|
|
742
|
+
"""The other graphs ``graph_id`` has rapporti with."""
|
|
743
|
+
from .links import linked_graphs as _linked
|
|
744
|
+
return _linked(container, graph_id)
|
|
687
745
|
|
|
688
746
|
|
|
689
747
|
# ── editorial stamps (last hand) ──────────────────────────────────────────────
|
|
@@ -1010,7 +1010,8 @@ def edge_outside_graph(has_node, source: Any, target: Any,
|
|
|
1010
1010
|
|
|
1011
1011
|
**The rule: an end that is a node of ANOTHER graph of the study refuses the
|
|
1012
1012
|
edge.** An edge lives in the section of one graph and joins two nodes of it;
|
|
1013
|
-
a
|
|
1013
|
+
a rapporto between graphs of one study (I-4, graph + UUID) is a LINK of
|
|
1014
|
+
the graph of its source, not an edge — :mod:`s3dgraphy.links`.
|
|
1014
1015
|
Until 5 Oct 2026 the CRDT took such an edge and the reader then dropped it:
|
|
1015
1016
|
a room accepted what its own file threw away.
|
|
1016
1017
|
|
|
@@ -1032,7 +1033,8 @@ def edge_outside_graph(has_node, source: Any, target: Any,
|
|
|
1032
1033
|
if other:
|
|
1033
1034
|
return (f"the node '{node_id}' is in the graph '{other}', not in "
|
|
1034
1035
|
f"this one: an edge joins two nodes of the same graph, and "
|
|
1035
|
-
f"a
|
|
1036
|
+
f"a rapporto between graphs is a link (graph + node), "
|
|
1037
|
+
f"not an edge")
|
|
1036
1038
|
return None
|
|
1037
1039
|
|
|
1038
1040
|
|
|
@@ -240,6 +240,24 @@ def build_emjson(graph: Graph, layout: Optional[Dict[str, Any]] = None) -> Dict[
|
|
|
240
240
|
"nodes": nodes,
|
|
241
241
|
"edges": edges,
|
|
242
242
|
}
|
|
243
|
+
# the HEADER of the graph (E.D., 11 Oct 2026): its stable id and the
|
|
244
|
+
# study's code side by side, readable without walking the nodes. The code
|
|
245
|
+
# is a MIRROR of StudyNode.data.code — written here, checked on import,
|
|
246
|
+
# and the study wins — or, when the study has none, what study_code reads
|
|
247
|
+
# (the GraphML header's ID, the retired em_id), so an old file's code is
|
|
248
|
+
# no longer lost at its first em.json. Written only when there is a code.
|
|
249
|
+
from ..hdto import is_code_proposed, study_code
|
|
250
|
+
code = study_code(graph)
|
|
251
|
+
if code:
|
|
252
|
+
graph_section["code"] = code
|
|
253
|
+
if is_code_proposed(graph):
|
|
254
|
+
graph_section["code_proposed"] = True
|
|
255
|
+
# the rapporti towards other graphs of the container (s3dgraphy.links):
|
|
256
|
+
# written only when there are some, so a graph without stays as it was
|
|
257
|
+
links = [dict(l) for l in (getattr(graph, "links", None) or [])
|
|
258
|
+
if isinstance(l, dict)]
|
|
259
|
+
if links:
|
|
260
|
+
graph_section["links"] = links
|
|
243
261
|
gname = _to_text(getattr(graph, "name", None))
|
|
244
262
|
if gname:
|
|
245
263
|
graph_section["name"] = gname
|
|
@@ -64,6 +64,9 @@ class Graph:
|
|
|
64
64
|
#: ``warnings`` alone, because nothing here knows what it points at.
|
|
65
65
|
self.warning_records = []
|
|
66
66
|
self.attributes = {}
|
|
67
|
+
#: the rapporti towards nodes of OTHER graphs of the container — see
|
|
68
|
+
#: :mod:`s3dgraphy.links` (E.D., 11 Oct 2026)
|
|
69
|
+
self.links = []
|
|
67
70
|
|
|
68
71
|
# Initialize graph indices
|
|
69
72
|
self._indices = None
|