transitive edge Introduces the idea of a transitive edge as a projection of an edges between nodes that can be used to hide the details of the internal connections within a graph, allowing you to focus on the start and end of graph. Genealogy family trees use just two basic edge types {mother, father} and one derived edge (child) - which in Hiperspace
are views projected from relational facts: Person { Name: 'Mark', Mother: 'Mary', Father: 'John'}
can be projected as a node and four edges { Mark -(mother)-> Mary; Mark -(father)-> John; Mark <-(child)- Mary; Mark <-(child)- John; }
that do not need to be stored to be accessed.
If you have an organisation with three divisions, each with 100 employees spread across 10 countries, each with 30 employees in each. If the chief executive has 3 devisional and 10 country reports, how many people in total report to the chief? The logical answer is 300, provided you don't double count! You can achieve the aggregate by:
employee -> chief
Transitive Edges solve all of these problems by hiding the intermediate edges. The problem becomes exponentially more complex when we consider Enterprise Architecture and the myriad connections between nodes.
If you want to prioritise work-packages for a System by the business goal being addressed, there are a myriad different paths between the work-package and business-goal with potentially many-many duplicates. What we really want is to is to transitively project all the paths between work-package and goal and priorize by business goal.
Hiperspace
TransitiveEdge
provides a mechanism to the declare Goals as an extension property of Work-Package. The TOGAF sample includes the segment
Togaf.Has.WorkPackage that has been extended with a property StrategicEdges
that is derived from a function, and Goals
that projects the set of TransitativeEdge
as Goal properties.
segment Togaf.Has.WorkPackage : Togaf.Base
= Node ( SKey = SKey, Name = Name, TypeName = "AF-WorkPackage"),
Edge (From = owner, To = this, Name = Name, TypeName = "AF-Has-WorkPackage") ,
Togaf.Edge2 (From = this, To = owner, Name = Name, TypeName = "AF-WorkPackage-For") ,
Graph.TransitiveEdge = StrategicEdges
[
"All Edges that can be projected as Transitative Edges to a Business Goal"
@Once
StrategicEdges = StrategicEdge(this),
Goals = Goals(StrategicEdges)
];
The functions use the Graph.Route
definition
From Type | To Type | ^ | Edge Type |
---|---|---|---|
AF-CourseOfAction | AF-Goal | AF-CourseOfAction-Goal | |
AF-Capability | AF-CourseOfAction | AF-Capability-Related | |
AF-Function | AF-CourseOfAction | AF-Function-CourseOfAction | |
AF-Capability | AF-Capability | ^ | AF-Capability-Part |
AF-Function | AF-Function | ^ | AF-Function-Part |
AF-Process | AF-Function | AF-Process-Function | |
AF-Process | AF-Capability | AF-Process-Capability | |
AF-Activity | AF-Process | AF-Activity-Process | |
AF-Service | AF-Activity | AF-Activity-Service | |
AF-System | AF-Service | AF-System-Service | |
AF-Component | AF-System | AF-Component-System | |
AF-Deployed | AF-Component | AF-Deployed-Component | |
AF-Platform | AF-Service | * | |
AF-Platform | AF-Platform | ^ | * |
AF-WorkPackage | AF-Function | AF-WorkPackage-For | |
AF-WorkPackage | AF-Capability | AF-WorkPackage-For | |
AF-WorkPackage | AF-Goal | AF-WorkPackage-For | |
AF-WorkPackage | AF-Activity | AF-WorkPackage-For | |
AF-WorkPackage | AF-Process | AF-WorkPackage-For | |
AF-WorkPackage | AF-CourseOfAction | AF-WorkPackage-For | |
AF-WorkPackage | AF-Service | AF-WorkPackage-For | |
AF-WorkPackage | AF-System | AF-WorkPackage-For | |
AF-WorkPackage | AF-Component | AF-WorkPackage-For | |
AF-WorkPackage | AF-Deployed | AF-WorkPackage-For | |
AF-WorkPackage | AF-Platform | AF-WorkPackage-For |
"^" denotes recursive search up through the hierarchy of {platform, function, business-capability}.
The strategic goal for each and every work-package can be found by:
Goals
(set) property of `WorkPackage'SELECT Name, "From", To, Width, Length FROM TransitiveEdges WHERE To.TypeName = 'AF-Goal';
" to querySELECT w.*, e.* FROM WorkPackages AS w, w.StrategicEdges AS e;
" - the join type here is appears to be a cross-join, but only because the sub-table StrategicEdges
has an implicit join to work-package.Hiperspace
uses a parallel Breadth-first search to search the graph of nodes, with recursive back-search to eliminate cyclic paths. The access of each Edge
set use parallel search of each element SetSpace
that provides the Edge
view, which (for very large datasets) can also parallel search partitions and generations.
Parallel search, and fact direct access not data means that even huge datasets are processes very quickly