Как определить Траверс для neo4j с Python? - PullRequest
2 голосов
/ 22 ноября 2011

Мне нужно пройти по графику neo4j, используя Python27.

Из руководства, которое я видел, я могу определить Обход и включить Оценщик , и я получил нечто похожее на это.

def my_evaluator(path):
    if (path.end['type'] == 'STOP') or (path.end['type'] == 'BUS_STOP'):
        return Evaluation.EXCLUDE_AND_CONTINUE
    else:
        return Evaluation.INCLUDE_AND_CONTINUE

def get_passengers_with_bus_stop(db, start_node):
    nodes = []

    traverser = db.traversal()\
        .relationships('STOPS_AT', INCOMING)\
        .relationships('HAS_BEEN', OUTGOING)\
        .evaluator(my_evaluator)\
        .traverse(start_node)

    # Name
    for n in traverser.nodes.iterator():
        nodes.append(n['name'])

    return nodes

Но из списка возвращенных узлов я хочу исключить первый узел и иногда останавливаться на каком-то глубине.

Как я могу сделать это с Обходами , которые определяют руководство de neo4j?

Иногда я находил презентацию, которая объясняет другой способ определения Обходы , но это не работает должным образом, я получаю и ошибку из Python. Нужно ли устанавливать что-то еще?

class Users(neo4j.Traversal): # Traversals ! queries in Neo4j
    types = [ neo4j.INCOMING.WORKS_AS,neo4j.OUTGOING.BELONGS_TO]
    order = neo4j.BREADTH_FIRST
    stop = neo4j.STOP_AT_END_OF_GRAPH
    returnable = neo4j.RETURN_ALL_BUT_START_NODE

Как я могу определить Траверс для neo4j с Python для:

  • Исключить первый узел
  • Остановись на глубине

Может быть, я должен использовать вычитания ? Как я могу их определить?

Более конкретно, я хочу определить Обход по этому графику, чтобы перейти от узла «Я» здесь к узлу «-1» или только к «+1». График определяет направление отношений и их имена.

enter image description here

1 Ответ

0 голосов
/ 12 декабря 2011

Вы можете объединить несколько оценщиков для достижения этой цели.Чтобы пропустить начальный узел, добавьте оценщик, который выглядит примерно так:

def exclude_start_node(path):
    if len(path) == 0:
        return Evaluation.EXCLUDE_AND_CONTINUE

    return Evaluation.INCLUDE_AND_CONTINUE

И чтобы остановиться на некоторой заданной глубине, примерно так:

def stop_at_depth(depth):
    def evaluator(path):
        if len(path) >= depth:
            return Evaluation.INCLUDE_AND_PRUNE

        return Evaluation.INCLUDE_AND_CONTINUE
    return evaluator

Вы бы использовали его такthis:

t = db.traverse().evaluator(stop_at_depth(5)).evaluator(exclude_start_node)

Обратите внимание, как оба этих траверсера используют INCLUDE_AND_CONTINUE там, где они не «применяются».При объединении оценщиков победит наиболее ограничительный оценщик.Поэтому, если какой-либо оценщик скажет «ИСКЛЮЧИТЬ», текущий узел будет исключен, а если какой-либо оценщик скажет «ПРОЧЬ», обход остановит текущий путь.

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

http://docs.neo4j.org/chunked/milestone/python-embedded-reference-cypher.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...