Stratigraphic Relationships
===========================
.. versionadded:: 1.2.16
Corrected relationship labels for US and USM units
Overview
--------
PyArchInit-Mini uses the Extended Matrix Framework to represent complex stratigraphic relationships beyond traditional Harris Matrix. This system supports both traditional stratigraphic units (US, USM) and extended unit types (USVA, USVB, USVC, TU, USD, CON, VSF, SF, Extractor, Combiner, DOC, property).
Relationship Label Types
------------------------
The Extended Matrix Framework uses three types of relationship labels:
1. **Textual Labels** (for US and USM)
2. **Single Symbols** (for standard Extended Matrix units)
3. **Double Symbols** (for special Extended Matrix units)
US and USM - Textual Labels
----------------------------
.. versionchanged:: 1.2.16
Fixed to use traditional textual relationship labels
Traditional stratigraphic units (US and USM) use **textual relationship labels** in both Italian and English:
Italian Labels
^^^^^^^^^^^^^^
* **Copre** - Covers (stratigraphic superposition)
* **Coperto da** - Covered by (inverse of Copre)
* **Taglia** - Cuts (truncation relationship)
* **Tagliato da** - Cut by (inverse of Taglia)
* **Riempie** - Fills (filling relationship)
* **Riempito da** - Filled by (inverse of Riempie)
* **Uguale a** - Same as/Equal to (contemporaneity)
* **Si lega a** - Bonds with (structural connection)
* **Si appoggia a** - Leans against (physical support)
English Labels
^^^^^^^^^^^^^^
* **Covers**
* **Covered by**
* **Cuts**
* **Cut by**
* **Fills**
* **Filled by**
* **Same as**
* **Equal to**
* **Bonds with**
* **Leans against**
Example
^^^^^^^
.. code-block:: python
# Traditional Harris Matrix relationship
US 1 --[Copre]--> US 2
US 3 --[Taglia]--> US 1
USM 5 --[Si appoggia a]--> USM 4
Visual Representation
^^^^^^^^^^^^^^^^^^^^^
In GraphML exports and Harris Matrix visualizations:
.. code-block:: text
┌────┐
│US 1│
└────┘
│ Copre
↓
┌────┐
│US 2│
└────┘
Standard Extended Matrix Units
-------------------------------
Standard Extended Matrix unit types use **single arrow symbols**:
Unit Types
^^^^^^^^^^
* **USVA** - Virtual Stratigraphic Unit A
* **USVB** - Virtual Stratigraphic Unit B
* **USVC** - Virtual Stratigraphic Unit C
* **TU** - Temporal Unit
* **USD** - Documented Stratigraphic Unit
* **CON** - Container
* **VSF** - Virtual Stratigraphic Function
* **SF** - Stratigraphic Function
Relationship Symbols
^^^^^^^^^^^^^^^^^^^^
* **>** - Forward relationship (predecessor → successor)
* **<** - Backward relationship (successor ← predecessor)
Example
^^^^^^^
.. code-block:: python
# Extended Matrix relationships with single symbols
USVA 1 --[>]--> USVA 2
TU 5 --[>]--> USD 3
CON 10 --[>]--> SF 8
Visual Representation
^^^^^^^^^^^^^^^^^^^^^
.. code-block:: text
┌──────┐
│USVA 1│
└──────┘
│ >
↓
┌──────┐
│USVA 2│
└──────┘
Special Extended Matrix Units
------------------------------
Special Extended Matrix unit types use **double arrow symbols**:
Unit Types
^^^^^^^^^^
* **Extractor** - Data extraction node
* **Combiner** - Data combination node
* **DOC** - Documentation node
* **property** - Property/attribute node
Relationship Symbols
^^^^^^^^^^^^^^^^^^^^
* **>>** - Strong forward relationship
* **<<** - Strong backward relationship
Example
^^^^^^^
.. code-block:: python
# Special units with double symbols
Extractor 1 --[>>]--> US 5
DOC 3 --[>>]--> Combiner 2
property 7 --[>>]--> US 10
Visual Representation
^^^^^^^^^^^^^^^^^^^^^
.. code-block:: text
┌───────────┐
│Extractor 1│
└───────────┘
│ >>
↓
┌────┐
│US 5│
└────┘
Complete Example
----------------
Mixed Unit Types
^^^^^^^^^^^^^^^^
A complex stratigraphic sequence might include:
.. code-block:: python
# Traditional stratigraphic relationships
US 1 --[Copre]--> US 2
US 3 --[Taglia]--> US 1
USM 4 --[Si appoggia a]--> US 2
# Extended Matrix units
USVA 10 --[>]--> US 1
TU 20 --[>]--> US 3
# Special documentation nodes
DOC 100 --[>>]--> US 1
Extractor 200 --[>>]--> USVA 10
Visual Matrix
^^^^^^^^^^^^^
.. code-block:: text
┌─────────────┐
│Extractor 200│
└─────────────┘
│ >>
↓
┌───────┐ ┌────────┐
│USVA 10│───────>──│DOC 100 │
└───────┘ └────────┘
│ > │ >>
↓ ↓
┌────┐ ┌────┐
│US 1│───Copre───>│US 2│
└────┘ └────┘
↑ Taglia ↑ Si appoggia a
│ │
┌────┐ ┌─────┐
│US 3│ │USM 4│
└────┘ └─────┘
↑ >
│
┌─────┐
│TU 20│
└─────┘
Implementation Details
----------------------
Code Example
^^^^^^^^^^^^
The relationship label determination is handled in ``pyarchinit_visualizer.py``:
.. code-block:: python
def _get_edge_label_for_unit(self, graph: nx.DiGraph, node: int, rel_type: str = '') -> str:
"""
Get appropriate edge label based on unit type.
Extended Matrix Framework Rules:
- US and USM: Use traditional textual labels (e.g., "Copre", "Taglia")
- USVA, USVB, USVC, TU, USD, CON, VSF, SF: Use single symbols (>, <)
- Extractor, Combiner, DOC, property: Use double symbols (>>, <<)
"""
node_data = graph.nodes[node]
unita_tipo = node_data.get('unita_tipo', 'US')
# US and USM use traditional textual relationship labels
if unita_tipo in ['US', 'USM']:
return rel_type if rel_type else 'Copre'
# Special units use double symbols
if unita_tipo in ['Extractor', 'Combiner', 'DOC', 'property']:
return '>>'
# Other Extended Matrix units use single symbol
return '>'
Database Schema
^^^^^^^^^^^^^^^
Relationships are stored in the ``us_relationships_table``:
.. code-block:: sql
CREATE TABLE us_relationships_table (
id INTEGER PRIMARY KEY AUTOINCREMENT,
sito VARCHAR(350) NOT NULL,
us_from VARCHAR(100) NOT NULL,
us_to VARCHAR(100) NOT NULL,
relationship_type VARCHAR(50) NOT NULL,
FOREIGN KEY (sito, us_from) REFERENCES us_table(sito, us),
FOREIGN KEY (sito, us_to) REFERENCES us_table(sito, us)
);
Relationship Types
^^^^^^^^^^^^^^^^^^
Valid relationship types depend on unit type:
**US/USM (Textual):**
.. code-block:: python
VALID_RELATIONSHIPS = [
'Copre', 'Coperto da',
'Taglia', 'Tagliato da',
'Riempie', 'Riempito da',
'Uguale a', 'Si lega a', 'Si appoggia a',
# English equivalents
'Covers', 'Covered by',
'Cuts', 'Cut by',
'Fills', 'Filled by',
'Same as', 'Equal to',
'Bonds with', 'Leans against'
]
**Standard Extended Matrix (Symbols):**
.. code-block:: python
STANDARD_SYMBOLS = ['>', '<']
**Special Extended Matrix (Double Symbols):**
.. code-block:: python
SPECIAL_SYMBOLS = ['>>', '<<']
GraphML Export
--------------
Label Export Format
^^^^^^^^^^^^^^^^^^^
When exporting to GraphML for yEd:
.. code-block:: xml
Copre
stratigraphic
>
extended_matrix
>>
documentation
Styling
^^^^^^^
Labels are styled differently based on type:
* **Textual labels**: Regular font, larger size
* **Single symbols**: Bold, medium size
* **Double symbols**: Bold, larger size, different color
Migration from Previous Versions
---------------------------------
Version 1.2.15 and Earlier
^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. deprecated:: 1.2.15
All units used symbolic labels
In versions prior to 1.2.16, all units (including US and USM) incorrectly used symbolic labels (``>`` or ``>>``).
Migration Steps
^^^^^^^^^^^^^^^
Existing installations do not need data migration. The change only affects visualization and export:
1. **Harris Matrix Visualization**: Regenerate using new labels
2. **GraphML Exports**: Re-export for correct yEd visualization
3. **Database**: No changes required (relationship_type field unchanged)
Use Cases
---------
Archaeological Recording
^^^^^^^^^^^^^^^^^^^^^^^^
Traditional excavation recording:
.. code-block:: python
# Layer sequence
US 1 (Topsoil) --[Copre]--> US 2 (Medieval layer)
US 2 --[Copre]--> US 3 (Roman layer)
# Cut feature
US 4 (Pit) --[Taglia]--> US 2
US 4 --[Taglia]--> US 3
# Wall relationships
USM 10 (Wall) --[Si appoggia a]--> US 3
Complex Documentation
^^^^^^^^^^^^^^^^^^^^^
Advanced documentation with Extended Matrix:
.. code-block:: python
# Core stratigraphic sequence
US 1 --[Copre]--> US 2
# Virtual aggregation
USVA 100 --[>]--> US 1
USVA 100 --[>]--> US 2
# Documentation nodes
DOC 200 --[>>]--> USVA 100
# Property extraction
Extractor 300 --[>>]--> DOC 200
API Usage
---------
Creating Relationships
^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: python
from pyarchinit_mini.services.us_service import USService
us_service = USService(db_manager)
# Traditional stratigraphic relationship
us_service.add_relationship(
sito='Pompei',
us_from='1',
us_to='2',
relationship_type='Copre'
)
# Extended Matrix relationship is handled automatically
# based on unit type
Querying Relationships
^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: python
# Get all relationships for a US
relationships = us_service.get_relationships(
sito='Pompei',
us='1'
)
# Returns list of dictionaries:
# [
# {'us_to': '2', 'relationship_type': 'Copre'},
# {'us_to': '5', 'relationship_type': 'Taglia'}
# ]
Validation
----------
The system validates relationships based on unit type:
.. code-block:: python
# Valid: US with textual label
add_relationship('US', '1', '2', 'Copre') # ✓
# Invalid: US with symbol
add_relationship('US', '1', '2', '>') # ✗ Error
# Valid: USVA with symbol
add_relationship('USVA', '1', '2', '>') # ✓
# Invalid: USVA with textual label
add_relationship('USVA', '1', '2', 'Copre') # ✗ Error
See Also
--------
* :doc:`harris_matrix` - Harris Matrix visualization
* :doc:`graphml_export` - GraphML export for yEd
* :doc:`../data/stratigraphic_units` - US data model
* :doc:`/EXTENDED_MATRIX_FRAMEWORK` - Complete Extended Matrix documentation