summaryrefslogblamecommitdiff
path: root/lib/Graph/GEXF.pm
blob: 83716c50fd08e70cde5519f8804abc0a1419652d (plain) (tree)

















































































































































                                                                                    
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/]};

has graph_mode => (
    is       => 'ro',
    isa      => enum([qw/static dynamic/]),
    required => 1,
    default  => 'static',
);

has edge_type => (
    is       => 'ro',
    isa      => enum([qw/directed undirected mutual notset/]),
    required => 1,
    default  => 'directed',
);

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',
    },
);

sub add_node_attribute {
    my ($self, $name, $type) = @_;

    my $id = $self->attributes_node_total();
    my $attr = {
        id    => $id,
        title => $name,
        type  => $type,
    };
    $self->set_node_attribute($name => $attr);
}

sub add_node {
    my ($self, $id) = @_;

    # TODO should be possible to add a Graph::GEXF::Node too

    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;

=head1 DESCRIPTION

=head2 ATTRIBUTES

=over 4

=item graph_mode

could be B<static> or B<dynamic>. Default is B<static>

=item edge_type

could be B<directed>, B<undirected>, B<mutual> or B<notset>. Default is B<directed>.

=back

=head2 METHODS

=over 4

=item add_node_attribute($name, $type)

Add attributes to node

=item add_node([$id])

Add a new node to the graph

=back