diff options
| author | franck cuny <franck@lumberjaph.net> | 2011-06-13 18:38:56 +0200 |
|---|---|---|
| committer | franck cuny <franck@lumberjaph.net> | 2011-06-13 18:38:56 +0200 |
| commit | a972089fecb01c62880c6a2a5bc5cbcb96105580 (patch) | |
| tree | 87468ea945f6e5fb457249142e1d4b5f5dc71c5a /lib/Graph/GEXF.pm | |
| parent | add flash (diff) | |
| download | stargit-a972089fecb01c62880c6a2a5bc5cbcb96105580.tar.gz | |
add Graph::GEXF while it's not on CPAN
Signed-off-by: franck cuny <franck@lumberjaph.net>
Diffstat (limited to 'lib/Graph/GEXF.pm')
| -rw-r--r-- | lib/Graph/GEXF.pm | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/lib/Graph/GEXF.pm b/lib/Graph/GEXF.pm new file mode 100644 index 0000000..f226b06 --- /dev/null +++ b/lib/Graph/GEXF.pm @@ -0,0 +1,177 @@ +package Graph::GEXF; + +# ABSTRACT: Manipulate graph file in GEXF + +use Moose; + +use Data::UUID::LibUUID; +use Moose::Util::TypeConstraints; + +use Graph::GEXF::Node; + +with + 'Graph::GEXF::Role::XML', + 'Graph::GEXF::Role::Attributes' => + { for => [qw/node edge/], with_method => 1 }; + +=attr visualization (B<Boolean>) + +if set to true, the generated graph will includes visualizations informations + +=cut + +has visualization => ( + is => 'ro', + isa => 'Bool', + predicate => 'has_visualization', +); + +=attr graph_mode (B<static|dynamic>) + +Is your graph static or dynamic. + +=cut + +has graph_mode => ( + is => 'ro', + isa => enum( [qw/static dynamic/] ), + required => 1, + default => 'static', +); + +=attr edge_type (B<directed|undirected|mutual|notset>) + +The type of the edges + +=cut + +has edge_type => ( + is => 'ro', + isa => enum( [qw/directed undirected mutual notset/] ), + required => 1, + default => 'directed', +); + +=attr nodes + +a HashRef of L<Graph::GEXF::Node> objects. + +=cut + +=method total_nodes + +Return the list of nodes attached to the graph + +=cut + +=method get_node + +Return a node + +=cut + +=method add_node_attribute($name, $type, [$default_value]) + +Add attributes to node + +=method all_nodes + +Return all the nodes + +=cut + +has nodes => ( + traits => ['Hash'], + is => 'rw', + isa => 'HashRef[Graph::GEXF::Node]', + default => sub { {} }, + auto_deref => 1, + handles => { + _node_exists => 'exists', + _add_node => 'set', + total_nodes => 'count', + get_node => 'get', + all_nodes => 'keys', + }, +); + +=method add_node + +Add a new node to the graph + +=cut + +sub add_node { + my $self = shift; + my ($id, %attributes); + + # TODO should be possible to add a Graph::GEXF::Node too + + if ( @_ == 1 ) { + $id = shift; + } + else { + if ( ( @_ % 2 ) == 0 ) { + %attributes = @_; + } + else { + $id = shift; + %attributes = @_; + } + } + + if ($id && $self->_node_exists($id)) { + die "Can't add node wih id $id: already exists"; + } + + $id = new_uuid_string() if !defined $id; + + my $node = Graph::GEXF::Node->new(id => $id); + + map { + my $attribute = $self->get_node_attribute($_); + $node->set_node_attribute( + $_ => { + id => $attribute->{id}, + name => $attribute->{name}, + type => $attribute->{type}, + } + ); + } $self->attributes_node_list; + + $self->_add_node($id => $node); + $node; +} + +1; + +=head1 SYNOPSIS + + # create a new graph + my $graph = Graph::GEXF->new(); + + # add some attributes for nodes + $graph->add_node_attribute('url', 'string'); + + # create a new node and set the label + my $n1 = $graph->add_node(0); + $n1->label('Gephi'); + + my $n2 = $graph->add_node(1); + $n2->label('WebAtlas'); + + my $n3 = $graph->add_node(2); + $n3->label('RTGI'); + + # create relations between nodes + $n1->link_to(1, 2); + $n2->link_to(0); + $n3->link_to(1); + + # set the value for attributes + $n1->attribute('url' => 'http://gephi.org/'); + $n2->attribute('url' => 'http://webatlas.fr/'); + $n3->attribute('url' => 'http://rtgi.fr/'); + + # render the graph in XML + my $xml = $graph->to_xml; |
