Пакетная обработка в py2neo

Я начал работать с Node4j и немного изучал пакетную обработку, но, к сожалению, у меня возникли проблемы с созданием отношений между узлами.

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

По сути, у меня есть эти две функции для создания узлов и отношений и добавления их в пакет.

graph_db = neo4j.GraphDatabaseService("http://localhost:7474/db/data/")
batch = neo4j.WriteBatch(graph_db)

def create_node(pvalue, svalue, type):
    return batch.create({\
        "pkey"  : pvalue,
        "skey"  : svalue,
        "type"  : type
        }
    )


def create_rel(from_node, type_label, to_node, fields):
    properties =\
    {"ACCT_KEY":  fields.ACCT_KEY}

    relation = rel(from_node, type_label, to_node, **properties)
    batch.create(relation)

Затем, после использования словаря, чтобы убедиться, что я не создал узлы раньше, я делаю:

node1 = create_node("ATTRIBUTE_1", "ATTRIBUTE_2", "WEBSITE")
node2 = create_node("ATTRIBUTE_3", "ATTRIBUTE_4", "USER")

create_rel(node1, "VISITED_BY", node2, fields)

Я сохраняю ссылки на «узел1» и «узел2» в словаре, поэтому, когда я хочу создать отношение с участием веб-сайта или уже зарегистрированного пользователя, я не буду создавать узел снова, а буду использовать непосредственно ссылку. Я делаю это внутри цикла, и он работает нормально, пока я не решу сделать это после определенного количества итераций:

batch.submit()
batch.clear()

Когда я решаю использовать эти ссылки из предыдущих пакетов, я получаю следующую ошибку:

Traceback (most recent call last):
    File "main.py", line 102, in <module>
        create_rel(cardholder, fraud_label, merchant,fields)
    File "main.py", line 33, in create_rel
        batch.create(relation)
    File "/usr/local/lib/python2.7/dist-packages/py2neo/neo4j.py", line 2775, in create
        "to": self._uri_for(entity.end_node)
    File "/usr/local/lib/python2.7/dist-packages/py2neo/neo4j.py", line 2613, in _uri_for
        uri = "{{{0}}}".format(self.find(resource))
    File "/usr/local/lib/python2.7/dist-packages/py2neo/neo4j.py", line 2604, in find
        raise ValueError("Request not found")
ValueError: Request not found

Я считаю, что это происходит потому, что он каким-то образом теряет ссылки из предыдущих партий, и они больше не действительны. Я попытался собрать идентификаторы с узлов и использовать их вместо этого, но не могу найти, как это сделать. Любая помощь будет оценена, спасибо.

Моя версия Node4j — «версия сообщества 2.0.3 для Unix», а версия py2neo — 1.6.4.


person Gorbag    schedule 22.05.2014    source источник


Ответы (1)


Приносим извинения, если это неясно из документации, но ссылки не могут распространяться на отдельные пакеты или пакетные отправки. Правильный способ обращения к ранее созданным элементам — проанализировать результаты первой отправки и передать необходимые сущности во вторую.

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

person Nigel Small    schedule 23.05.2014