swish-0.10.6.0: A semantic web toolkit.
Copyright(c) 2003 Graham Klyne 2009 Vasili I Galchin 2011 2012 2022 Douglas Burke
LicenseGPL V2
MaintainerDouglas Burke
Stabilityexperimental
PortabilityCPP, DerivingStrategies
Safe HaskellSafe-Inferred
LanguageHaskell2010

Swish.GraphPartition

Description

This module contains functions for partitioning a graph into subgraphs that rooted from different subject nodes.

Synopsis

Documentation

data PartitionedGraph lb Source #

Representation of a graph as a collection of (possibly nested) partitions. Each node in the graph appears at least once as the root value of a GraphPartition value:

  • Nodes that are the subject of at least one statement appear as the first value of exactly one PartSub constructor, and may also appear in any number of PartObj constructors.
  • Nodes appearing only as objects of statements appear only in PartObj constructors.

Constructors

PartitionedGraph [GraphPartition lb] 

Instances

Instances details
Label lb => Show (PartitionedGraph lb) Source # 
Instance details

Defined in Swish.GraphPartition

Label lb => Eq (PartitionedGraph lb) Source # 
Instance details

Defined in Swish.GraphPartition

getArcs :: PartitionedGraph lb -> [Arc lb] Source #

Returns all the arcs in the partitioned graph.

getPartitions :: PartitionedGraph lb -> [GraphPartition lb] Source #

Returns a list of partitions.

data GraphPartition lb Source #

Represent a partition of a graph by a node and (optional) contents.

Constructors

PartObj lb 
PartSub lb (NonEmpty (lb, GraphPartition lb)) 

Instances

Instances details
Label lb => Show (GraphPartition lb) Source # 
Instance details

Defined in Swish.GraphPartition

Label lb => Eq (GraphPartition lb) Source #

Equality is based on total structural equivalence rather than graph equality.

Instance details

Defined in Swish.GraphPartition

Label lb => Ord (GraphPartition lb) Source # 
Instance details

Defined in Swish.GraphPartition

node :: GraphPartition lb -> lb Source #

Returns the node for the partition.

toArcs :: GraphPartition lb -> [Arc lb] Source #

Creates a list of arcs from the partition. The empty list is returned for PartObj.

partitionGraph :: Label lb => [Arc lb] -> PartitionedGraph lb Source #

Turning a partitioned graph into a flat graph is easy. The interesting challenge is to turn a flat graph into a partitioned graph that is more useful for certain purposes. Currently, I'm interested in:

  1. isolating differences between graphs
  2. pretty-printing graphs

For (1), the goal is to separate subgraphs that are known to be equivalent from subgraphs that are known to be different, such that:

  • different sub-graphs are minimized,
  • different sub-graphs are placed into 1:1 correspondence (possibly with null subgraphs), and
  • only deterministic matching decisions are made.

For (2), the goal is to decide when a subgraph is to be treated as nested in another partition, or treated as a new top-level partition. If a subgraph is referenced by exactly one graph partition, it should be nested in that partition, otherwise it should be a new top-level partition.

Strategy. Examining just subject and object nodes:

  • all non-blank subject nodes are the root of a top-level partition
  • blank subject nodes that are not the object of exactly one statement are the root of a top-level partition.
  • blank nodes referenced as the object of exactly 1 statement of an existing partition are the root of a sub-partition of the refering partition.
  • what remain are circular chains of blank nodes not referenced elsewhere: for each such chain, pick a root node arbitrarily.

comparePartitions :: Label lb => PartitionedGraph lb -> PartitionedGraph lb -> [(Maybe (GraphPartition lb), Maybe (GraphPartition lb))] Source #

Create a list of pairs of corresponding Partitions that are unequal.

partitionShowP :: Label lb => String -> GraphPartition lb -> String Source #

Convert a partition into a string with a leading separator string.