Сохранение значений переменных в других частях запроса шифра - PullRequest
0 голосов
/ 13 декабря 2018

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

FOREACH(ignoreMe IN CASE WHEN "${record:value('/11')}" <> "" THEN [1] ELSE [] END |
  MERGE (company:Company{name:"${record:value('/11')}"}))

FOREACH(ignoreMe IN CASE WHEN "${record:value('/1')}" <> "" THEN [1] ELSE [] END |
  MERGE (cloudSuite:CloudSuite{name:"${record:value('/1')}"}))

FOREACH(ignoreMe IN CASE WHEN "${record:value('/18')}" <> "" THEN [1] ELSE [] END |
  MERGE (application:Application{name:"${record:value('/18')}"}))

FOREACH(ignoreMe IN CASE WHEN "${record:value('/8')}" <> "" THEN [1] ELSE [] END |
  MERGE (applicationInstance:ApplicationInstance{applicationId:"${record:value('/8')}"}))

FOREACH(ignoreMe IN CASE WHEN "${record:value('/9')}" <> "" THEN [1] ELSE [] END |
  MERGE (screen:Screen{name:"${record:value('/9')}"}))

FOREACH(ignoreMe IN CASE WHEN "${record:value('/19')}" <> "" THEN [1] ELSE [] END |
  MERGE (screenInstance:ScreenInstance{screenId:"${record:value('/19')}"}))

FOREACH(ignoreMe IN CASE WHEN ("${record:value('/0')}" IN ["Accessed"])THEN [1] ELSE [] END |
    MERGE (screenInstance)-[:INSTANCE_OF]->(screen)
    MERGE (screenInstance)-[:VIEWED_ON]->(applicationInstance)
    MERGE (application)-[:IMPLEMENTS]->(screen)
    MERGE (session)-[:ACCESSES]->(screenInstance))

Однако на самом деле происходит то, что, когда я визуализирую свой график, я вижу действительные узлы, определенные как бесхозные узлы, и отношения, созданные между некоторыми "фантомными" узлами.Поэтому мой вопрос заключается в том, можно ли мне передать ссылку на действительные узлы в MERGE, который создает отношения.

1 Ответ

0 голосов
/ 14 декабря 2018

Вы не сможете использовать этот подход, так как вы обнаружили, что переменные, введенные в FOREACH, не будут доступны вне его.

Возможно, вы захотите взглянуть на использование условных процедур APOC (используйте apoc.do.when() proc) вместо обходного пути FOREACH.Вы можете возвращать значения из выполненного Cypher, которые доступны через переменную карты value.

Например, глядя только на первый фрагмент:

CALL apoc.do.when("${record:value('/11')}" <> "", 
"MERGE (company:Company{name:\"${record:value('/11')}\"}) RETURN company") YIELD value
WITH value.company as company
...

Имейте в виду, что еслизапрос в условной переменной должен использовать переменную вне условной переменной, вам нужно передать ее через карту параметров.

...