3.5. Special Thing Patterns¶
3.5.1. Period Things¶
A period Thing represents a span of time, often with associated geographic extent and cultural characteristics.
Characteristics:
Has Name(s) with
name_typeincluding “chrononym”Classified via attestation with
typed_byedge to AUTHORITY document with classification “period”Has Timespan attestations defining its temporal bounds
Members are Things that existed during that period
Member temporalities can vary; the period’s Timespan represents the outer bounds
May have explicit Geometry or inherit from members
Graph Structure:
Period Thing (e.g., "Tang Dynasty")
←[subject_of]← Attestation ─[attests_name]→ Name("Tang Dynasty", chrononym)
←[subject_of]← Attestation ─[attests_name]→ Name("唐朝", chrononym)
←[subject_of]← Attestation ─[typed_by]→ Authority(classification: "period")
←[subject_of]← Attestation ─[attests_timespan]→ Timespan(618-907 CE)
←[subject_of]← Attestation ─[attests_geometry]→ Geometry(Tang territory)
Member Things:
Thing(Chang'an) ←[subject_of]← Attestation ─[typed_by]→ Authority(member_of)
└─[relates_to]→ Thing(Tang Dynasty)
PeriodO Integration:
PeriodO periods import as Things with external IDs (e.g.,
periodo:p0qhb9d)PeriodO data maps directly to Thing + Name + Timespan + Geometry attestations
WHG-created periods follow the same pattern with
whg:namespace
Example: “Tang Dynasty” as a period Thing:
ID:
things/tang-dynastyHas chrononym Names via attestations: “Tang Dynasty” (English), “唐朝” (Chinese)
Classified as “period” via Authority
Has Timespan: 618-907 CE via attestation
Members include Chang’an, Luoyang (each with their own Timespan attestations)
Geometry can be explicit (official territory) or inherited (union of member cities)
3.5.2. Route Things¶
A route Thing represents a sequentially-ordered set of places, typically without specific temporal information about traversal.
Characteristics:
Classified via attestation with
typed_byedge to AUTHORITY document with classification “route”Members are Things representing segments (waypoints or path sections)
Segments are ordered using the
sequencefield in Attestation nodesTimespan attestations are optional or represent when the route existed (not traversal times)
May include path Geometries as separate Things with LineString geometries
Graph Structure:
Route Thing (e.g., "Silk Road")
←[subject_of]← Attestation ─[attests_name]→ Name("Silk Road")
←[subject_of]← Attestation ─[typed_by]→ Authority(classification: "route")
←[subject_of]← Attestation ─[attests_timespan]→ Timespan(route's existence)
Member Things (with sequence):
Thing(Chang'an) ←[subject_of]← Attestation(sequence: 1) ─[typed_by]→ Authority(member_of)
└─[relates_to]→ Thing(Silk Road)
Thing(Dunhuang) ←[subject_of]← Attestation(sequence: 2) ─[typed_by]→ Authority(member_of)
└─[relates_to]→ Thing(Silk Road)
Thing(Samarkand) ←[subject_of]← Attestation(sequence: 3) ─[typed_by]→ Authority(member_of)
└─[relates_to]→ Thing(Silk Road)
Examples:
Silk Road: waypoints across Central Asia
Roman Roads (ORBIS): network of road segments
Maritime routes: documented sea lanes
Hajj routes: established pilgrimage paths
Distinction from Itinerary:
Routes may have no temporal data on traversal
If temporal data exists, it represents the route’s period of use, not a specific journey
Routes are conceptual pathways; itineraries are actual journeys
3.5.3. Itinerary Things¶
An itinerary Thing represents a journey or route through space and time, with temporal information about when segments were traversed.
Characteristics:
Classified via attestation with
typed_byedge to AUTHORITY document with classification “itinerary”Members are Things representing segments (waypoints, routes, or regions)
Segments are ordered using the
sequencefield in Attestation nodesEach segment attestation has its own Timespan attestation (when that segment was traversed)
Itinerary’s overall Timespan is the outer bounds of segment Timespans (unless explicitly overridden)
Segments can be:
Destinations: Things representing places visited (points or regions)
Routes: Things with LineString Geometries representing paths between destinations
Mixed: Some segments may be large regions traversed without specific routes
Graph Structure:
Itinerary Thing (e.g., "Marco Polo's Journey")
←[subject_of]← Attestation ─[attests_name]→ Name("Marco Polo's Journey to China")
←[subject_of]← Attestation ─[typed_by]→ Authority(classification: "itinerary")
←[subject_of]← Attestation ─[attests_timespan]→ Timespan(1271-1295, computed)
Member Things (with sequence and temporal data):
Thing(Venice) ←[subject_of]← Attestation(sequence: 1) ─[typed_by]→ Authority(member_of)
├─[relates_to]→ Thing(Marco Polo Journey)
└─[attests_timespan]→ Timespan(Jan-Jun 1271)
Thing(Route-to-Constantinople) ←[subject_of]← Attestation(sequence: 2)
├─[typed_by]→ Authority(member_of)
├─[relates_to]→ Thing(Marco Polo Journey)
└─[attests_timespan]→ Timespan(Jun-Sep 1271)
Thing(Constantinople) ←[subject_of]← Attestation(sequence: 3)
├─[typed_by]→ Authority(member_of)
├─[relates_to]→ Thing(Marco Polo Journey)
└─[attests_timespan]→ Timespan(Sep-Nov 1271)
Examples:
Travel diaries and itineraries: Ibn Battuta, Marco Polo, Xuanzang
Military campaigns: Napoleon’s marches, Alexander the Great’s conquests, Crusades
Voyage data from ships’ logs: 18th-19th century naval and merchant shipping
Migration pathways: Documented historical migrations with temporal progression
Note on terminology: Each entry in an itinerary is called a segment, which encompasses both waypoints/destinations and routes between them.
3.5.4. Network Things¶
A network Thing represents a set of connections between places that may not follow a particular sequence.
Characteristics:
Classified via attestation with
typed_byedge to AUTHORITY document with classification “network”Connections between Things are attested using
connected_torelation type (via AUTHORITY)Connections may have Timespan attestations (when the connection existed)
Connection metadata in Attestation nodes specifies type, directionality, and other attributes
Multiple attestations can represent the same connection at different times or from different sources
Networks do not store detailed route geometries by default; these can be linked via references to route Things or Geometry records
Graph Structure:
Network Thing (e.g., "Mediterranean Trade Network")
←[subject_of]← Attestation ─[attests_name]→ Name("Mediterranean Trade Network")
←[subject_of]← Attestation ─[typed_by]→ Authority(classification: "network")
←[subject_of]← Attestation ─[attests_timespan]→ Timespan(network's operational period)
Connections (via connected_to attestations):
Thing(Constantinople) ←[subject_of]← Attestation(connection_metadata: {...})
├─[typed_by]→ Authority(connected_to)
├─[relates_to]→ Thing(Venice)
└─[attests_timespan]→ Timespan(1200-1453)
Thing(Venice) ←[subject_of]← Attestation(connection_metadata: {...})
├─[typed_by]→ Authority(connected_to)
├─[relates_to]→ Thing(Alexandria)
└─[attests_timespan]→ Timespan(1100-1500)
Connection Metadata Structure (in Attestation node):
{
"connection_metadata": {
"connection_type": "trade",
"directionality": "bidirectional",
"commodity": ["spices", "silk"],
"intensity": 0.9,
"frequency": "monthly"
}
}
Examples:
Communication networks: postal routes, telegraph lines
Commercial networks: trade between ports (e.g., Sound Toll Registers)
Administrative links: imperial governance connections
Social networks: diplomatic exchanges, pilgrimage networks
Temporal Dynamics:
Connections can appear and disappear over time
Multiple attestations with different Timespans model changing relationships
Network evolution queries track emergence and dissolution of connections
3.5.5. Gazetteer Group Things¶
A gazetteer group Thing represents a thematic collection of gazetteers sharing common characteristics.
Characteristics:
Classified via attestation with
typed_byedge to AUTHORITY document with classification “gazetteer_group”Members are other Things (which are themselves gazetteers) linked via
member_ofattestationsCan have its own Names describing the collection theme
May have Timespan attestations representing the collection’s temporal scope
May have inherited Geometry from member gazetteers
Graph Structure:
Gazetteer Group Thing (e.g., "Ancient World Gazetteers")
←[subject_of]← Attestation ─[attests_name]→ Name("Ancient World Gazetteers")
←[subject_of]← Attestation ─[typed_by]→ Authority(classification: "gazetteer_group")
←[subject_of]← Attestation ─[attests_timespan]→ Timespan(-3000 to 500)
Member Things:
Thing(Pleiades) ←[subject_of]← Attestation ─[typed_by]→ Authority(member_of)
└─[relates_to]→ Thing(Ancient World Gazetteers)
Thing(DARMC) ←[subject_of]← Attestation ─[typed_by]→ Authority(member_of)
└─[relates_to]→ Thing(Ancient World Gazetteers)
Thing(Barrington) ←[subject_of]← Attestation ─[typed_by]→ Authority(member_of)
└─[relates_to]→ Thing(Ancient World Gazetteers)
Examples:
Ancient World Gazetteers: combining Pleiades, DARMC, Barrington Atlas
Colonial Gazetteers: British, French, Spanish colonial archives
Environmental History Gazetteers: climate/landscape datasets
Religious Networks: pilgrimage sites and sacred places
Historical Urban Gazetteers: city-focused collections
Use Cases:
Thematic browsing and discovery
Cross-gazetteer queries within a domain
Collection-level metadata and DOI assignment
Curated research datasets
3.5.6. Timespan Inheritance and Computation¶
Similar to Geometry inheritance, Timespan inheritance can be computed for Things lacking explicit Timespan attestations.
Field Naming Note: All examples use end_earliest and end_latest (not stop_earliest/stop_latest) for consistency with W3C Time Ontology. This applies to all timespan operations including inheritance and computation.
Computation Rules:
For compositional Things (with members):
Find all member Things via
member_ofattestationsFor each member, find its Timespan attestations via graph traversal
Compute outer bounds:
start_earliest= minimum of all memberstart_earliestvaluesstart_latest= minimum of all memberstart_latestvaluesend_earliest= maximum of all memberend_earliestvaluesend_latest= maximum of all memberend_latestvalues
For periods:
By default, compute from members
Explicit Timespan attestation overrides computation
Useful for defining period boundaries that don’t perfectly align with member existence
For itineraries:
Automatically compute from segment Timespans
Itinerary duration = earliest segment start to latest segment end
Can be overridden for overall journey context (e.g., preparation/return time)
Example Query (AQL):
// Compute Timespan for Tang Dynasty from members
LET dynasty = DOCUMENT("things/tang-dynasty")
// Find all member Things
LET members = (
FOR att IN attestations
FOR e1 IN edges
FILTER e1._to == att._id
FILTER e1.edge_type == "subject_of"
LET member = DOCUMENT(e1._from)
// Check if this is a member_of attestation
FOR e2 IN edges
FILTER e2._from == att._id
FILTER e2.edge_type == "typed_by"
LET relType = DOCUMENT(e2._to)
FILTER relType.label == "member_of"
// Get the parent Thing
FOR e3 IN edges
FILTER e3._from == att._id
FILTER e3.edge_type == "relates_to"
FILTER e3._to == dynasty._id
// Get member's Timespan
FOR memberAtt IN attestations
FOR e4 IN edges
FILTER e4._from == member._id
FILTER e4._to == memberAtt._id
FILTER e4.edge_type == "subject_of"
FOR e5 IN edges
FILTER e5._from == memberAtt._id
FILTER e5.edge_type == "attests_timespan"
LET timespan = DOCUMENT(e5._to)
RETURN timespan
)
// Compute bounds
RETURN {
start_earliest: MIN(members[*].start_earliest),
start_latest: MIN(members[*].start_latest),
end_earliest: MAX(members[*].end_earliest),
end_latest: MAX(members[*].end_latest)
}
Example Result:
// Tang Dynasty period Thing (no explicit Timespan)
// Members:
// - Chang'an (Timespan: 618-904)
// - Luoyang (Timespan: 618-907)
// - Canton (Timespan: 650-900)
// Computed Timespan for Tang Dynasty:
{
"start_earliest": 618,
"start_latest": 650,
"end_earliest": 900,
"end_latest": 907
}
Override example:
// Tang Dynasty with explicit Timespan attestation
Thing(Tang Dynasty) ←[subject_of]← Attestation ─[attests_timespan]→ Timespan(618-907)
// This explicit attestation overrides the computed bounds from members
3.5.7. Geometry Inheritance¶
Note on GeometryCollection: ArangoDB does not support the GeoJSON GeometryCollection type. For Things with heterogeneous geometries (e.g., both point and polygon), create multiple geometry attestations—one per geometry type. This naturally aligns with the attestation model where each geometry claim is a separate evidential statement.
Things can inherit Geometry from their members when no explicit Geometry attestation exists:
Computation Pattern:
// Find inherited Geometry for a Route Thing
FOR thing IN things
FILTER thing._id == "things/silk-road"
// Check if explicit Geometry exists
LET explicitGeom = (
FOR att IN attestations
FOR e1 IN edges
FILTER e1._from == thing._id
FILTER e1._to == att._id
FILTER e1.edge_type == "subject_of"
FOR e2 IN edges
FILTER e2._from == att._id
FILTER e2.edge_type == "attests_geometry"
RETURN DOCUMENT(e2._to)
)
// If no explicit Geometry, compute from members
LET inheritedGeom = LENGTH(explicitGeom) == 0 ? (
// Find all member geometries
FOR member IN members
// Get member's Geometry
// Then compute union/convex hull
) : null
RETURN {
explicit: explicitGeom,
inherited: inheritedGeom
}
Use Cases:
Routes inherit LineString from member waypoints
Periods inherit Polygon from member territories
Networks inherit point cloud from connected nodes