Cypher: соответствие узлов во вложенном FOREACH - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть вложенный цикл FOREACH, которому нужно сопоставить тег с несколькими метками.

OPTIONAL MATCH (a: Article {URL: event.URL})

FOREACH(ignoreme in case when a is  null then [1] else [] end |
CREATE (a: Article {URL: event.URL})
//other statements ..... //
FOREACH (relation in CASE WHEN event.article.nlp_relations is not null then event.article.nlp_relations else [] end |

         match (a)-[:HAS_NLP_TAG]->(t_from) where (t_from:Tag or t_from:Entity) and t_from.value = relation.from.value
        match (a)-[:HAS_NLP_TAG]->(t_to) where (t_to:Tag or t_to:Entity) and t_to.value = relation.to.value
        call apoc.create.relationship(t_from,relation.type , {}, t_to)
)     
 ) 

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

1 Ответ

0 голосов
/ 30 сентября 2019

Похоже, что вы можете просто переформулировать свою вторую FOREACH как обычную MATCH - CREATE комбинацию, что-то вроде (я не пытался ее запустить):

OPTIONAL MATCH (a: Article {URL: event.URL})

FOREACH(ignoreme in case when a is  null then [1] else [] end |
  CREATE (a: Article {URL: event.URL}
)
//other statements ..... //
unwind Case When event.article.nlp_relations is null then [] else event.article.nlp_relations end as relation
match (a)-[:HAS_NLP_TAG]->(t_from) where (t_from:Tag or t_from:Entity) and t_from.value = relation.from.value
match (a)-[:HAS_NLP_TAG]->(t_to) where (t_to:Tag or t_to:Entity) and t_to.value = relation.to.value
call apoc.create.relationship(t_from,relation.type , {}, t_to)
)

Выможет потребоваться вставить соответствующее WITH -Statement перед MATCH -statements.

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