Динамическое создание отношений Neo4j / Cypher с переменной меткой MATCH - PullRequest
0 голосов
/ 23 октября 2018

Мне нужно создать отношения между существующими узлами, и я попробовал следовать YouTube при создании динамических узлов и отношений: https://www.youtube.com/watch?v=KsAb8QHClNg пару раз, но я не думаю, что они охватывают мой вариант использования.

Пример данных:

SOURCE  TARGET  LABEL   TYPE    SOURCE_TYPE TARGET_TYPE SOURCE_KEY  TARGET_KEY  PHLEVEL COLOR   SIZE    SCOPE
16      1   ERKRS_ROOT  DIRECTED    ERKRS   ROOT    ERKRS_R300  ROOT_EC3_800    0       #808080 1   FALSE
12      1   ERKRS_ROOT  DIRECTED    ERKRS   ROOT    ERKRS_INT1  ROOT_EC3_800    0       #808080 1   FALSE
51      1   KKBER_ROOT  DIRECTED    KKBER   ROOT    KKBER_GVK1  ROOT_EC3_800    0       #808080 1   FALSE
31      1   KKBER_ROOT  DIRECTED    KKBER   ROOT    KKBER_6000  ROOT_EC3_800    0       #808080 1   FALSE
71      1   FIKRS_ROOT  DIRECTED    FIKRS   ROOT    FIKRS_1000  ROOT_EC3_800    0       #808080 1   FALSE
334     9   KOKRS_ERKRS DIRECTED    KOKRS   ERKRS   KOKRS_2000  ERKRS_IDEA      1       #808080 1   FALSE
335     9   KOKRS_ERKRS DIRECTED    KOKRS   ERKRS   KOKRS_2200  ERKRS_IDEA      1       #808080 1   FALSE
342     9   KOKRS_ERKRS DIRECTED    KOKRS   ERKRS   KOKRS_4500  ERKRS_IDEA      1       #808080 1   FALSE

Я успешно создал узлы динамически, используя apoc.create.node с моим файлом узлов.Метки узла = SOURCE_TYPE или TARGET_TYPE.Атрибут KEY узла = SOURCE_KEY или TARGET_KEY.Взаимосвязь - это столбец LABEL.

Теперь передо мной стоит задача создания взаимосвязей, поскольку предложение MATCH не принимает метку из моего файла - это мой сценарий:

USING PERIODIC COMMIT 500 LOAD CSV WITH HEADERS  FROM 'file:///IDES__Edges1.csv' AS line
MATCH (x:line.SOURCE_TYPE {key:line.SOURCE_KEY}), (y:line.TARGET_TYPE {key:line.TARGET_KEY})
CALL apoc.create.relationship(x, line.LABEL, y) YIELD rel RETURN count(*)

Я получаю эту ошибку...

    Neo.ClientError.Statement.SyntaxError: Invalid input '.': expected an identifier character, whitespace, NodeLabel, a property map, ')' or a relationship pattern (line 2, column 15 (offset: 103))
"   MATCH (x:line.SOURCE_TYPE {key:line.SOURCE_KEY}), (y:line.TARGET_TYPE {key:line.TARGET_KEY})"

У кого-нибудь есть идеи, как к этому подойти?Я так близко к решению моей проблемы!Любая помощь приветствуется.John

1 Ответ

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

Это иллюстрирует, почему рекомендуется обрабатывать отдельные CSV-файлы для каждого типа узла, поэтому вы всегда сможете узнать, какую метку жестко закодировать в запросе.

Это требование для Cypher, потому что когда меткижестко закодированы, планировщик использует метаданные в БД, чтобы помочь в том, как эффективно планировать выполнение запроса (оценка динамических меток должна произойти во время выполнения ... это бесполезно для планировщика, который должен планировать запрос до выполнения).

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

Итак, после применения общей метки (давайте просто назовем ее: Node for now) и индексасоздан на: Узел (ключ), это так же просто, как:

USING PERIODIC COMMIT 500 LOAD CSV WITH HEADERS  FROM 'file:///IDES__Edges1.csv' AS line
MATCH (x:Node {key:line.SOURCE_KEY}), (y:Node {key:line.TARGET_KEY})
CALL apoc.create.relationship(x, line.LABEL, y) YIELD rel 
RETURN count(*)

Это предполагает, конечно, что ключи являются уникальными среди всехУзлы со всеми заданными метками.Если это не так, тогда потребуется другой подход.

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