2013-12-18 2 views
0

я создал базу данных с помощью графа py2neo и цель:Исключения при создании пакетного отношения между узлами при использовании py2neo

  • Создать один узел для каждого города. В узле хранится название города и уникальный идентификатор, связанный с ним.
  • Создайте один узел для каждого аэропорта. Узел аэропорта хранит название аэропорта и снова уникальный идентификатор.
  • Создайте связь между узлом города и узлом аэропорта, если аэропорт находится в этом городе.

Я создал город узлы первого (успешно) с помощью этого модуля:

batch = neo4j.WriteBatch(graph_db)  
for city_id,city_name in <some_list>: 
    city_node_id = batch.create(node(city_id=city_id, name=city_name)) 
    batch.add_indexed_node('city_index','city_id',city_id, city_node_id) 
batch.submit() 

Затем в другом отдельном модуле я попытался создать узлы аэропорта и отношения между узлом аэропорта и соответствующим городом узлом, как это:

read_batch = neo4j.ReadBatch(graph_db) 
write_batch = neo4j.WriteBatch(graph_db) 
for airport_id, city_id, airport_name in <some_list>: 
    airport_node_id = write_batch.create(node(airport_id=airport_id, city_id=city_id, name=airport_name)) 
    write_batch.add_indexed_node('airport_index','airport_id',airport_id, airport_node_id) 
    city_node_id = read_batch.get_indexed_nodes('city_index','city_id',city_id) 
    rel_id = write_batch.create(rel(airport_node_id, "is in city", city_node_id)) 
    write_batch.add_indexed_relationship('airport_rel_index','airport_id',airport_id, rel_id) 
write_batch.submit() 

3-заявление от последнего, в котором я творю отношения бросает исключение:

rel_id = write_batch.create(rel(airport_node_id, "is in city", city_node_id)) 
File "/usr/local/lib/python2.7/dist-packages/py2neo/neo4j.py", line 2695, in create 
"to": self._uri_for(entity.end_node) 
File "/usr/local/lib/python2.7/dist-packages/py2neo/neo4j.py", line 2537, in _uri_for 
uri = "{{{0}}}".format(self.find(resource)) 
File "/usr/local/lib/python2.7/dist-packages/py2neo/neo4j.py", line 2528, in find 
raise ValueError("Request not found") 
    ValueError: Request not found 

Я попытался напечатать uri обоих типов узлов. Их разница:

print station_node_id._uri, city_node_id._uri 

Выход:

node index/node/city_index/city_id/2536650 

Так URIs обоего узлов различен, поэтому я предполагаю, что отношения не получают созданы.

Какую функцию я могу использовать, которая возвращает неиндексированный узел для города, то есть uri должен быть просто «узлом» вместо «index/node/city_index/ city_id /».

Есть ли другой способ создать отношения?

Я был бы рад предоставить любую другую информацию, если потребуется. Спасибо заранее!

Neo4j: 1.9.5

py2neo: 1.6.1

ответ

1

То, что вы видите, это прискорбное ограничение сервера в результате чего Место URIs возвращаемые некоторыми REST вызовов содержит запись индекса узла URI вместо URI стандартного узла. Это, к сожалению, полезно только в нескольких случаях использования и серьезном ограничении в таких случаях, как ваш.

Существует аналогичная проблема, обсуждаемая здесь - https://github.com/nigelsmall/py2neo/issues/221 - и, к сожалению, я ничего не могу сделать с клиентской стороны.

Ваш единственный реальный вариант - разделить работу на несколько партий или - если вы в состоянии это сделать - рассмотрите обновление до Neo4j 2.0, где вы можете использовать новые возможности индекса и схемы.

+0

Я обновился до версии neo4j 2.0, но проблема все еще сохраняется. В моем случае проблема не может быть решена, даже если я делаю второй модуль в разных партиях, потому что мне нужно ** node_id ** при предоставлении ** city_id **. И независимо от того, что я делаю, идентификатор узла, возвращаемый с использованием ** city_index **, всегда относится к индексу, а не к исходному узлу. Есть что-то, чего я не хватает? Спасибо, Найджел! – VineetChirania

+0

Я даже пытался использовать отдельную партию для создания связей в графе, но даже это не сработало. – VineetChirania

+0

BatchRequests, возвращаемые методами WriteBatch, являются просто заполнителями для возвращаемых значений, а не самими значениями возврата. Если вы соберете результаты вызова 'submit', вы найдете созданные узлы. Затем вы можете использовать их в последующей партии для создания отношений. –

Смежные вопросы