Оператор UNWIND в Cypher Neo4J не выполняется, если предыдущий не дал результатов? - PullRequest
0 голосов
/ 24 января 2019

Этот запрос ниже обычно работает, когда у меня есть совпадение на c_from и c_to:

MATCH (u:User {uid: $userId}) 
WITH u UNWIND $statements as statement  
WITH u, statement 
UNWIND statement.conceptsRelations as conceptsRelation 
MATCH (c_from:Concept{name: conceptsRelation.from}) 
MATCH (c_to:Concept{name: conceptsRelation.to}) 
CREATE (c_from)-[:TO {context:conceptsRelation.context,statement:conceptsRelation.statement,user:u.uid,timestamp:conceptsRelation.timestamp, uid:apoc.create.uuid(), gapscan:conceptsRelation.gapscan, weight: conceptsRelation.weight}]->(c_to)  
WITH u, statement 
UNWIND statement.mentionsRelations as mentionsRelation 
MATCH (m_from:Concept{name: mentionsRelation.from}) 
MATCH (m_to:Concept{name: mentionsRelation.to}) return m_from, m_to

Однако, как только у меня не будет совпадений, последняя часть запроса (последняя UNWIND) не будет выполнена. Я проверил это, удалив 2-й UNWIND, а затем третий снова работает Как в:

MATCH (u:User {uid: $userId}) 
WITH u UNWIND $statements as statement  
WITH u, statement 
UNWIND statement.mentionsRelations as mentionsRelation 
MATCH (m_from:Concept{name: mentionsRelation.from}) 
MATCH (m_to:Concept{name: mentionsRelation.to}) return m_from, m_to

На всякий случай, мои параметры:

{ "userId": "15229100-b20e-11e3-80d3-6150cb20a1b9", "contextNames": [ { "uid": "af8debb0-1f71-11e9-a572-691cc47b060f", "name": "dsfasdf" } ], "statements": [ { "text": "@submit desire", "concepts": [ "desire" ], "mentions": [ "@submit" ], "timestamp": 15482915128250000, "name": "#desire @@submit ", "uid": "2bd1f170-1f73-11e9-a508-0d8a16ad5cf6", "uniqueconcepts": [ "desire" ], "conceptsRelations": [], "mentionsRelations": [ { "from": "desire", "to": "@submit", "context": "af8debb0-1f71-11e9-a572-691cc47b060f", "statement": "2bd1f170-1f73-11e9-a508-0d8a16ad5cf6", "user": "15229100-b20e-11e3-80d3-6150cb20a1b9", "timestamp": 15482915128250000, "uid": "apoc.create.uuid()", "gapscan": "1", "weight": 3 } ], "uniquementions": [ "@submit" ] } ], "timestamp": 15482915128250000 }

Это кажется странным нелогичным поведением. Есть идеи, почему это возникает? Спасибо!

1 Ответ

0 голосов
/ 24 января 2019

Использование UNWIND - это превращение списка в строки. Если у вас пустой список, вы получаете ноль строк.

Вы можете добавить элемент в список, если он пустой:

UNWIND case when size(list) = 0 then [null] else list end

или

UNWIND list + null

А затем пропустите специальное значение во второй части.

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