Функция создания py2neo, создающая дубликаты узлов

У меня есть база данных Neo4j, содержащая информацию о конгрессменах. У меня проблема, если есть вакантное место. Когда это происходит, я использую тот же ключ: значение в индексе «Конгрессмены». Я попробовал приведенный ниже код, потому что в документации py2neo указано, что функция добавления является идемпотентной.

#Check if we have any vacancies and if so if they match the one that we currently want to add
    query="start n=node:Congressmen('website:N/A') return n"
    result= cypher.execute(graph_db, query.encode('utf-8', errors='ignore'))

    #Match what  we already have
    if str(result[0]) != "[]":
        #create is idempotent so will only create a new node if properties are different
        rep, = graph_db.create({"name" : userName, "website" : web, "district" : int(district), "state" : child[2].text, "party" : child[4].text, "office" : child[5].text, "phone" : child[6].text, "house" : "House of Representatives"})
        cong = graph_db.get_or_create_index(neo4j.Node, "Congressmen")

        # add the node to the index
        cong.add("website", web, rep)

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

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


person drowningincode    schedule 13.08.2013    source источник


Ответы (1)


Метод Index.add, безусловно, идемпотентный: один и тот же объект можно добавить только один раз в конкретную точку входа. Однако метод GraphDatabaseService.create не является. Каждый раз, когда вы запускаете метод create, создается новый узел, и каждый запуск add добавляет этот новый узел в индекс. Вместо этого вы, вероятно, захотите использовать метод Index.add_if_none, Index.create_if_none или Index.get_or_create.

person Nigel Small    schedule 13.08.2013