static GraphDescription create(Graph graph) {
   if (graph == null) {
     return EMPTY;
   }
   Map<String, NODE> nodes = new HashMap<String, NODE>();
   for (NODE node : graph.nodes()) {
     if (nodes.put(defined(node.name()), node) != null) {
       throw new IllegalArgumentException("Node \"" + node.name() + "\" defined more than once");
     }
   }
   Map<String, REL> rels = new HashMap<String, REL>();
   List<REL> relationships = new ArrayList<REL>();
   for (REL rel : graph.relationships()) {
     createIfAbsent(nodes, rel.start());
     createIfAbsent(nodes, rel.end());
     String name = rel.name();
     if (!name.equals("")) {
       if (rels.put(name, rel) != null) {
         throw new IllegalArgumentException(
             "Relationship \"" + name + "\" defined more than once");
       }
     }
     relationships.add(rel);
   }
   parse(graph.value(), nodes, relationships);
   return new GraphDescription(
       nodes.values().toArray(NO_NODES),
       relationships.toArray(NO_RELS),
       graph.autoIndexNodes(),
       graph.autoIndexRelationships());
 }
 @Override
 public Map<String, Node> create(GraphDatabaseService graphdb) {
   Map<String, Node> result = new HashMap<String, Node>();
   Transaction tx = graphdb.beginTx();
   try {
     graphdb.index().getRelationshipAutoIndexer().setEnabled(autoIndexRelationships);
     for (NODE def : nodes) {
       result.put(
           def.name(),
           init(
               graphdb.createNode(),
               def.setNameProperty() ? def.name() : null,
               def.properties(),
               graphdb.index().getNodeAutoIndexer(),
               autoIndexNodes));
     }
     for (REL def : rels) {
       init(
           result
               .get(def.start())
               .createRelationshipTo(
                   result.get(def.end()), DynamicRelationshipType.withName(def.type())),
           def.setNameProperty() ? def.name() : null,
           def.properties(),
           graphdb.index().getRelationshipAutoIndexer(),
           autoIndexRelationships);
     }
     tx.success();
   } finally {
     tx.finish();
   }
   return result;
 }