Как установить метку как переменную в запросе шифра при использовании драйвера Neo4j Python - PullRequest
3 голосов
/ 21 сентября 2019

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

Вот чтоЯ сделал:

class Neo4jClient(object):
    def __init__(self, uri, user, password):
        self._driver = GraphDatabase.driver(uri, auth=basic_auth(user, password))
    def close(self):
        self._driver.close()
    def merge_nodes_relationships(self, anchor_data):
        event = anchor_data.event
        anchor = anchor_data.anchor
        for k, v in anchor.items():
            relation = session.write_transaction(self.create_event_anchor_relation, event, k, v)
    @staticmethod
    def create_event_anchor_relation(tx, event, anchorkey, anchorvalue):
        result =  tx.run("MATCH(e: Event {id : $eventid}), (a: $Anchor {id:$anchorvalue)"
                         "MERGE(e)-[r:$RelationShip]-(a)"
                         "RETURN r", eventid=event['id'], Anchor=anchorkey, anchorvalue=anchorvalue, RelationShip='EVENT_' + anchorkey
                         )
        return result.single()[0]

Но выдается ошибка, говорящая

Неверный ввод '$': ожидаемый пробел или имя метки (строка 1, столбец 10 (смещение: 9)) \ n \ "MERGE (a: $ Anchor {id: $ id}) \ "\ n

Так как мне это исправить?если параметризованная метка или отношение не поддерживается, то лучше всего обрабатывать случай, когда приходит много меток с одинаковыми свойствами, но им нужно другое имя метки.

1 Ответ

1 голос
/ 23 сентября 2019

Этого, как правило, следует избегать, но будет работать следующее:

MATCH (e :Event {id: $eventid}), (a {id: $anchorvalue)
WHERE $Anchor IN LABELS(a)
MERGE(e)-[r]-(a)
WHERE $RelationShip IN LABELS(r)
RETURN r

РЕДАКТИРОВАТЬ: Чтобы увидеть, почему это плохо, выполните следующие два запроса:

PROFILE
MATCH (e :Event)
RETURN e

И

PROFILE
MATCH (e)
WHERE "Event" IN LABELS(e)
RETURN e

Обратите внимание, что они на самом деле возвращают одно и то же, но делают это по-разному.

Первый запускает NodeByLabelScan, который быстро просматривает все узлы с меткой «Событие».Из-за того, как Neo4j хранит эти данные, эти узлы «хранятся вместе» и очень быстро ищут.

Второй запрос выполняется AllNodesScan, а затем Filter.Таким образом, каждый отдельный узел в базе данных должен быть проверен, чтобы увидеть, имеет ли он «Событие» в качестве метки.

В общем, если вы используете метку в качестве переменной, вы не выбрали оченьхорошая структура для ваших данных.

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