Neo4j, py2neo, Neomodel - ошибка определения кратчайшего пути Cypher - TypeError: объект NotImplementedType не вызывается
Я пытаюсь запустить следующий запрос Cypher в neomodel:
MATCH (b1:Bal { text:'flame' }), (b2:Bal { text:'candle' }),
p = shortestPath((b1)-[*..15]-(b2))
RETURN p
который прекрасно работает на neo4j через консоль сервера. Возвращает 3 узла с двумя связями. Тем не менее, когда я пытаюсь следующее в Python:
# Py2Neo version of cypher query in python
from py2neo import neo4j
graph_db = neo4j.GraphDatabaseService()
shortest_path_text = "MATCH (b1:Bal { text:'flame' }), (b2:Bal { text:'candle' }), p = shortestPath((b1)-[*..15]-(b2)) RETURN p"
results = neo4j.CypherQuery(graph_db, shortest_path_text).execute()
или же
# neomodel version of cypher query in python
from neomodel import db
shortest_path_text = "MATCH (b1:Bal { text:'flame' }), (b2:Bal { text:'candle' }), p = shortestPath((b1)-[*..15]-(b2)) RETURN p"
results, meta = db.cypher_query(shortest_path_text)
оба дают следующую ошибку:
/Library/Python/2.7/site-packages/neomodel-1.0.1-py2.7.egg/neomodel/util.py in _hydrated(data)
73 elif obj_type == 'relationship':
74 return Rel(data)
---> 75 raise NotImplemented("Don't know how to inflate: " + repr(data))
76 elif neo4j.is_collection(data):
77 return type(data)([_hydrated(datum) for datum in data])
TypeError: 'NotImplementedType' object is not callable
что имеет смысл, учитывая, что neomodel основан на py2neo.
Главный вопрос заключается в том, как заставить работать запрос shorttestPath с помощью любого из них? Есть ли лучший метод внутри Python? или Cypher лучший способ сделать это?
редактировать:
Я также попробовал следующее отсюда, который дал ту же ошибку.
graph_db = neo4j.GraphDatabaseService()
query_string = "START beginning=node(1), end=node(4) \
MATCH p = shortestPath(beginning-[*..500]-end) \
RETURN p"
result = neo4j.CypherQuery(graph_db, query_string).execute()
for r in result:
print type(r) # r is a py2neo.util.Record object
print type(r.p) # p is a py2neo.neo4j.Path object
2 ответа
Хорошо, я понял это. Я использовал учебник [здесь](основываясь на ответе @nigel-small.
from py2neo import cypher
session = cypher.Session("http://localhost:7474")
tx = session.create_transaction()
tx.append("START beginning=node(3), end=node(16) MATCH p = shortestPath(beginning-[*..500]-end) RETURN p")
tx.execute()
который вернулся:
[[Record(columns=(u'p',), values=(Path(Node('http://localhost:7474/db/data/node/3'), ('threads', {}), Node('http://localhost:7474/db/data/node/1'), ('threads', {}), Node('http://localhost:7474/db/data/node/2'), ('threads', {}), Node('http://localhost:7474/db/data/node/16')),))]]
Отсюда, я ожидаю, что я надуваю каждое из значений обратно в мои объекты neomodel и в django для более легкой манипуляции. Выложу этот код, как я получу там.
Предоставленное вами сообщение об ошибке относится только к neomodel, и похоже, что оно возникло, так как пока нет никакой поддержки для надувания объектов py2neo Path в neomodel.
Однако это должно хорошо работать в сыром py2neo, так как пути полностью поддерживаются, поэтому, возможно, стоит попробовать это снова. Py2neo определенно не вызовет ошибку из кода Neomodel. Я только что попробовал shortestPath
запросить себя, и он возвращает значение, как ожидалось.