Использование транзакций Neo4j с драйвером болта Python - PullRequest
1 голос
/ 21 апреля 2019

У меня есть код, который успешно создает новый узел, используя драйвер Python Bolt Neo4j.Однако я не могу создать новые отношения в той же транзакции.

Я использую Python 2.7 с приводом Neo4j Bolt 1.7.2.

    with conn.session() as session:
        uuid = getNewUUID()
        tx = None
        try:
            tx = session.begin_transaction()
            stmt = "CREATE (a:{type} {{{uuid_attrib}: $uuid, {name_attrib}: $name, {desc_attrib}: $desc, {has_phi_attrib}: $has_phi}}) RETURN a.{uuid_attrib}".format(                                                                                                                                                               
                    type=ENTITY_NODE_NAME, uuid_attrib=UUID_ATTRIBUTE, 
                    name_attrib=NAME_ATTRIBUTE, desc_attrib=DESCRIPTION_ATTRIBUTE,  
                    has_phi_attrib=HAS_PHI_ATTRIBUTE)
            #print "EXECUTING: " + stmt
            tx.run(stmt, uuid=uuid, name=name, desc=description, has_phi=hasPHI)
            create_relationship(tx, uuid, DERIVED_FROM_REL, parentUUID)
            create_relationship(tx, uuid, LAB_CREATED_AT_REL, labCreatedUUID)
            create_relationship(tx, uuid, CREATED_BY_REL, createdByUUID)
            tx.commit()
            return uuid

, вот метод create_relationship:

def create_relationship(tx, startuuid, rel_label, enduuid):
    try:
        stmt = "MATCH (a),(b) WHERE a.uuid = '$startuuid' AND b.uuid = '$enduuid' CREATE (a)-[r:{rel_label}]->(b) RETURN type(r)".format(                                                                                                                                                               
                    rel_label=rel_label)
        temp_stmt = stmt
        temp_stmt = temp_stmt.replace("$startuuid", startuuid)
        temp_stmt = temp_stmt.replace("$enduuid", enduuid)
        print "EXECUTING: " + temp_stmt
        result = tx.run(stmt,startuuid=startuuid, enduuid=enduuid)

Код успешно создает узел в Neo4j.Тем не менее, отношения никогда не создаются.Я ожидал, что отношения будут добавлены к узлу.Если я скопирую и вставлю команды CREATE в веб-интерфейс bolt, команда CREATE сработает.

1 Ответ

2 голосов
/ 22 апреля 2019

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

Когда вы фиксируете tx, транзакции из функции create_relationship не фиксируются, поскольку они не являются частью tx.

Вы должны рассмотреть возможность выполнения этих транзакций в вызывающей функциивместо create_relationship, используйте create_relationship или аналогичную функцию для создания и возврата оператора и запускайте этот оператор в вызывающей функции.

Функция для получения оператора:

def get_relationship_statement(startuuid, rel_label, enduuid):
        stmt = "MATCH (a),(b) WHERE a.uuid = '$startuuid' AND b.uuid = '$enduuid' CREATE (a)-[r:{rel_label}]->(b) RETURN type(r)".format(                                                                                                                                                               
                    rel_label=rel_label)
        temp_stmt = stmt
        temp_stmt = temp_stmt.replace("$startuuid", startuuid)
        temp_stmt = temp_stmt.replace("$enduuid", enduuid)
        print "Statement: " + temp_stmt
        return stmt

Заменить

create_relationship(tx, uuid, DERIVED_FROM_REL, parentUUID)

на

tx.run(get_relationship_statement(uuid, DERIVED_FROM_REL, parentUUID),startuuid=uuid, enduuid=parentUUID)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...