Neo4j, py2neo, Neomodel - Cypher Shortest Path дает ошибку - 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()

or

# 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

что имеет смысл, учитывая, что неомодель основана на py2neo.

Главный вопрос заключается в том, как заставить работать самый короткий запрос с помощью любого из них? Есть ли лучший метод в Python? или шифр - лучший способ сделать это?

edit:
Я также попробовал следующее из здесь, которое дало ту же ошибку.

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

person raschwab    schedule 02.10.2014    source источник


Ответы (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 для упрощения манипуляций. Я отправлю этот код, когда доберусь туда.

person raschwab    schedule 03.10.2014

Сообщение об ошибке, которое вы предоставляете, относится к neomodel и, похоже, возникло, поскольку в neomodel еще нет поддержки для раздувания объектов Path py2neo.

Однако это должно нормально работать в raw py2neo, поскольку пути полностью поддерживаются, поэтому, возможно, стоит попробовать это еще раз. Py2neo определенно не вызовет ошибку в коде neomodel. Я только что попробовал shortestPath запрос, и он возвращает ожидаемое значение.

person Nigel Small    schedule 02.10.2014
comment
Спасибо, Найджел. Не могли бы вы опубликовать свой пример кода? Мне любопытно, как мне запустить необработанный запрос шифра py2neo в python, поскольку я думал, что это то, что я сделал выше .. - person raschwab; 03.10.2014