我使用 py2neo 创建了一个图形数据库,目的是:
- 为每个城市创建一个节点。该节点存储城市名称和与之关联的唯一 ID。
- 为每个机场创建一个节点。机场节点存储机场名称和唯一的 ID。
- 如果机场在该城市,则在城市节点和机场节点之间创建关系。
我首先(成功地)使用这个模块创建了城市节点:
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()
我正在创建关系的最后第三条语句抛出异常:
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 应该只是“节点”而不是“索引/节点/城市索引/城市 ID/”。
有没有其他方法可以建立这种关系?
如果需要,我很乐意提供任何其他信息。提前致谢!
Neo4j:1.9.5
py2neo:1.6.1