Como posso criar eficientemente relacionamentos únicos no Neo4j?

Seguindo minha perguntaaqui, Gostaria de criar uma restrição nos relacionamentos. Ou seja, eu gostaria que houvesse vários nós que compartilhem o mesmo nome de "bairro", mas cada um deles aponte exclusivamente para uma cidade específica em que residem.

Conforme incentivado em user2194039responda, Estou usando o seguinte índice:

CREATE INDEX ON :Neighborhood(name)

Além disso, tenho a seguinte restrição:

CREATE CONSTRAINT ON (c:City) ASSERT c.name IS UNIQUE;

O código a seguir falha ao criar relacionamentos exclusivos e leva um período excessivamente longo:

USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM "file://THEFILE" as line
WITH line
WHERE line.Neighborhood IS NOT NULL
WITH line
MATCH (c:City { name : line.City})
MERGE (c)<-[:IN]-(n:Neighborhood {name : toInt(line.Neighborhood)});

Observe que há uma restrição de exclusividade na cidade, mas NÃO na vizinhança (porque deve haver várias).

Perfil com limite 10.000:

+--------------+------+--------+---------------------------+------------------------------+
|     Operator | Rows | DbHits |               Identifiers |                        Other |
+--------------+------+--------+---------------------------+------------------------------+
|  EmptyResult |    0 |      0 |                           |                              |
|  UpdateGraph |    9750 |      3360 | anon[307], b, neighborhood, line |                 MergePattern |
|  SchemaIndex |    9750 |      19500 |                   b, line | line.City; :City(name) |
| ColumnFilter |    9750 |      0 |                      line |            keep columns line |
|       Filter |    9750 |      0 |           anon[220], line |                    anon[220] |
|      Extract |    10000 |      0 |           anon[220], line |                    anon[220] |
|        Slice |    10000 |      0 |                      line |                 {  AUTOINT0} |
|      LoadCSV |    10000 |      0 |                      line |                              |
+--------------+------+--------+---------------------------+------------------------------+

Total de acessos ao banco de dados: 22860

Seguindo a recomendação de Guilherme abaixo, implementei o auxiliar, mas ele está causando o erro py2neo.error.Finished. Pesquisei a documentação e não consegui determinar uma solução alternativa a partir deesta. Parece que há umpost SO aberto sobre essa exceção.

def run_batch_query(queries, timeout=None):
if timeout:
    http.socket_timeout = timeout
try:
    graph = Graph()
    authenticate("localhost:7474", "account", "password")
    tx = graph.cypher.begin()
    for query in queries:
        statement, params = query
        tx.append(statement, params)
        results = tx.process()
        tx.commit()
except http.SocketError as err:
    raise err
except error.Finished as err:
    raise err
collection = []
for result in results:
    records = []
    for record in result:
        records.append(record)
    collection.append(records)  
return collection

a Principal:

queries = []
template = ["MERGE (city:City {Name:{city}})", "Merge (city)<-[:IN]-(n:Neighborhood {Name : {neighborhood}})"]
statement = '\n'.join(template)
batch = 5000
c = 1
start = time.time()

# city_neighborhood_map is a defaultdict that maps city-> set of neighborhoods
for city, neighborhoods in city_neighborhood_map.iteritems():
    for neighborhood in neighborhoods:
        params = dict(city=city, neighborhood=neighborhood)
        queries.append((statement, params))
        c +=1
        if c % batch == 0:
            print "running batch"
            print c
            s = time.time()*1000
            r = run_batch_query(queries, 10)
            e = time.time()*1000
            print("\t{0}, {1:.00f}ms".format(c, e-s))
            del queries[:]

print c
if queries:
    s = time.time()*1000 
    r = run_batch_query(queries, 300)
    e = time.time()*1000
    print("\t{0} {1:.00f}ms".format(c, e-s))
end = time.time()
print("End. {0}s".format(end-start))

questionAnswers(2)

yourAnswerToTheQuestion