Вставка узлов в Agensgraph через Python и Cypher - PullRequest
0 голосов
/ 29 октября 2018

В этом примере я пытаюсь добавить новый авторский узел, принимающий переменные вне шифровального кода. Этот метод работает с обычным кодом PostgreSQL, но я пытаюсь получить правильный синтаксис, чтобы позволить Python сделать это для меня. Я импортировал pyscopg2 и agensgraph. Код работает нормально, если атрибуты добавляются вручную. Следующий код возвращает ошибку:

Объект 'str' не может быть вызван

    def newAuthor(self):
    self.statusBar().showMessage('Processing...')
    try:
        # connect to the PostgreSQL server
        conn = psycopg2.connect("dbname=agens host=localhost user=agens password=pw port=5433")
        cur = conn.cursor()

        cur.execute("""SET graph_path = publications;""")


        name = 'Apel'
        firstName = 'Jan'
        lastName = 'Apel'
        initials = ''

        cur.execute("""
        CREATE (n:Author { name: %s, firstName: %s, lastName: %s, initials: %s })
        """(name, firstName, lastName, initials))


        cur.close()
        conn.commit()
        self.statusBar().showMessage('Ready')
    except (Exception, psycopg2.DatabaseError) as error:
        print(error)
    finally:
        conn.close()

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Я знаю, что это довольно поздний ответ, и вы нашли ответ самостоятельно.

Просто хочу поделиться своим способом использования cypher-запроса в python. Надеюсь, это может пригодиться кому-то в будущем.

Если вы не против связать параметры с их порядком, вы можете использовать следующий способ:

createCypher = "CREATE (n:Author {name : %s, firstName : %s, lastName : %s, initials : %s })"
name = "Apel"
firstName = "Jan"
lastName = "Apel"
initials = ""
cur.execute (createCypher, (name, firstName, lastName, initials, ))

Однако, если вы хотите указать местоположение параметра с помощью ключа диктовки, я считаю, что построение строки запроса с форматом - единственный способ:

createCypher = "CREATE (n:SUBJECT {{name :'{name}', firstName: '{firstName}', lastName : '{lastName}', initials : '{initials}' }})"
param = {}
param["name"] = "Apel2"
param["firstName"] = "Jan2"
param["lastName"] = "Apel2"
param["initials"] = ""
cur.execute(createCypher2.format(**param))

Обе работы находят для меня.

0 голосов
/ 29 октября 2018

Это решило проблему, это лучший способ?

        name = 'Apel'
        firstName = 'Jan'
        lastName = 'Apel'
        initials = ''
        cypher = "CREATE (n:Author { name:  \'"   + name + "\', firstName: \'" + firstName + "\', lastName: \'" + lastName + "\', initials: \'" + initials + "\' })"
        cur.execute(cypher)
...