Как выполнить запрос шифра в предложении CASE WHEN THEN в Neo4j Cypher - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть сценарий использования, когда я пытаюсь оптимизировать мои вызовы и код Neo4j db, используя предложения RETURN CASE WHEN THEN в Cypher для выполнения разных запросов в зависимости от результата WHEN.Это мой пример:

MATCH (n {email: 'abc123@abc.com'}) 
RETURN  
CASE WHEN n.category='Owner' THEN  MATCH '(n)-[r:OWNS]->(m)'  
WHEN n.category='Dealer' THEN MATCH (n)-[r:SUPPLY_PARTS_FOR]->(m) 
WHEN n.category='Mechanic' THEN MATCH (n)-[r:SERVICE]-(m) END 
AS result;

Я не уверен, что это законно, но это то, чего я хочу достичь.Я получаю синтаксические ошибки, такие как неверный ввод '>'.Как я могу добиться этого наилучшим образом?РЕДАКТИРОВАТЬ возможное решение APOC: Это был мой план до обнаружения ограничения FOREACH ...

MATCH (user:Person {email:{paramEmail}})
FOREACH (_ IN case when 'Owner' = {paramCategory} then [1] else [] end|
SET user:Owner, user += queryObj 
WITH user, {paramVehicles} AS coll
UNWIND coll AS vehicle
MATCH(v:Vehicles {name:vehicle}) 
CREATE UNIQUE (user)-[r:OWNS {since: timestamp()}]->(v)
SET r += paramVehicleProps 
)
FOREACH (_ IN case when 'Mechanic' = {Category} then [1] else [] end|
SET user:Owner, user += queryObj 
WITH user, {paramVehicles} AS coll
….
)
FOREACH (_ IN case when 'Dealer' = {paramCategory} then [1] else [] end|
SET user:Owner, user += queryObj 
WITH user, {paramVehicles} AS coll
…...

)
RETURN user,
CASE {paramCategory}

WHEN 'Owner' THEN [(n)-[r:OWNS]->(m) | m and r]
 WHEN 'Dealer' THEN [(n)-[r:SUPPLY_PARTS_FOR]->(m) | m] 
WHEN 'Mechanic' THEN [(n)-[r:SERVICE]-(m) | m]
 END AS result`,{
 paramQueryObj: queryObj,
 paramVehicles: makeVehicleArray,
 paramVehicleProps: vehiclePropsArray,
 paramSalesAgent: dealerSalesAgentObjarray,
 paramWarehouseAgent: dealerWarehouseAgentObjarray
}).....

Кто-нибудь знает, чтобы преобразовать это с помощью apoc.do.when ()?обратите внимание, мне нужны «м» и «г» в первом ТО.

1 Ответ

0 голосов
/ 21 ноября 2018

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

для вашего запроса вы можете использовать шаблоны:

MATCH (n:Person {email: 'abc123@abc.com'}) 
RETURN  
CASE n.category 
WHEN 'Owner'    THEN  [(n)-[r:OWNS]->(m) | m]
WHEN 'Dealer'   THEN [(n)-[r:SUPPLY_PARTS_FOR]->(m) | m] 
WHEN 'Mechanic' THEN [(n)-[r:SERVICE]-(m) | m] END 
AS result;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...