def createGraph(self, name, createCollections = True, isSmart = False, numberOfShards = None, smartGraphAttribute = None) :
        def _checkCollectionList(lst) :
            for colName in lst :
                if not COL.isCollection(colName) :
                    raise ValueError("'%s' is not a defined Collection" % colName)
        graphClass = GR.getGraphClass(name)
        ed = []
        for e in graphClass._edgeDefinitions :
            if not COL.isEdgeCollection(e.edgesCollection) :
                raise ValueError("'%s' is not a defined Edge Collection" % e.edgesCollection)
            _checkCollectionList(e.fromCollections)
            _checkCollectionList(e.toCollections)
            ed.append(e.toJson())
        _checkCollectionList(graphClass._orphanedCollections)
        options = {}
        if numberOfShards:
            options['numberOfShards'] = numberOfShards
        if smartGraphAttribute:
            options['smartGraphAttribute'] = smartGraphAttribute
        payload = {
                "name": name,
                "edgeDefinitions": ed,
                "orphanCollections": graphClass._orphanedCollections
            }
        if isSmart :
                payload['isSmart'] = isSmart
        if options:
            payload['options'] = options
        payload = json.dumps(payload)
        r = self.connection.session.post(self.graphsURL, data = payload)
        data = r.json()
        if r.status_code == 201 or r.status_code == 202 :
            self.graphs[name] = graphClass(self, data["graph"])
        else :
            raise CreationError(data["errorMessage"], data)
        return self.graphs[name]