The problem here is that DirectedMultigraph doest not allow loops and in your first loop you are trying to do
graph.addEdge(people.get(0), person, new RelationshipEdge<String>(people.get(0), person, friend));
which translates to
graph.addEdge("John", "John", new RelationshipEdge<String>("John", "John", friend)); on the first iteration.
Your option here is to either use a DefaultDirectedGraph (a non-simple directed graph in which multiple edges between any two vertices are not permitted, but loops are) or rewrite your code so that it does not try to friend John with "himself".

2014-03-15 16:18 GMT+01:00 Patricia_Sim <ptrcsim@gmail.com>:
Hi Everybody

I'm trying to create directed graph with label edge by jgrapht. I learn how
to create by "LabeledEdges" example which source code shown below

public class LabeledEdges {
    private static final String friend = "friend";
    private static final String enemy = "enemy";

    public static void main(String[] args) {
        DirectedGraph<String, RelationshipEdge> graph =
            new DirectedMultigraph<String, RelationshipEdge>(
                    new ClassBasedEdgeFactory<String,

        ArrayList<String> people = new ArrayList<String>();

        // John is everyone's friend
        for (String person : people) {
            graph.addEdge(people.get(0), person, new
RelationshipEdge<String>(people.get(0), person, friend));

        // Apparently James doesn't really like John
        graph.addEdge("James", "John", new RelationshipEdge<String>("James",
"John", enemy));

        // Jessica is Sarah and James's friend
        graph.addEdge("Jessica", "Sarah", new
RelationshipEdge<String>("Jessica", "Sarah", friend));
        graph.addEdge("Jessica", "James", new
RelationshipEdge<String>("Jessica", "James", friend));

        // But Sarah doesn't really like James
        graph.addEdge("Sarah", "James", new
RelationshipEdge<String>("Sarah", "James", enemy));

         for (RelationshipEdge edge : graph.edgeSet()) {
        if (edge.toString().equals("enemy")) {
            System.out.printf(edge.getV1()+"is an enemy of "+
        } else if (edge.toString().equals("friend")) {
            System.out.printf( edge.getV1()+" is a friend of "+

    public static class RelationshipEdge<V> extends DefaultEdge {
        private V v1;
        private V v2;
        private String label;

        public RelationshipEdge(V v1, V v2, String label) {
            this.v1 = v1;
            this.v2 = v2;
            this.label = label;

        public V getV1() {
            return v1;

        public V getV2() {
            return v2;

        public String toString() {
            return label;

However, when I run this example, it show the error message
        "Exception in thread "main" java.lang.IllegalArgumentException:
loops not allowed
        at org.jgrapht.graph.AbstractBaseGraph.addEdge(AbstractBaseGraph.java:243)"

How can I do to run this example

View this message in context: http://jgrapht-users.107614.n3.nabble.com/Label-Edge-Example-tp4024899.html
Sent from the jgrapht-users mailing list archive at Nabble.com.

Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their
applications. Written by three acclaimed leaders in the field,
this first edition is now available. Download your free book today!
jgrapht-users mailing list