Исключение синтаксиса CQL - PullRequest
       6

Исключение синтаксиса CQL

0 голосов
/ 31 октября 2019

Neo.ClientError.Statement.SyntaxError: Неверный ввод ')': ожидаемый пробел или шаблон отношения (строка 66, столбец 100 (смещение: 1898)) "CREATE (z: Subscription {subscriptionId: subs.subscriptionId, startDate: subs.startDate, endDate: ''}) <- [r: ASSOCIATION] - (y: Person {nationalIdentityNumber: subs.nationalIdentityNumber, имя: subs.name, фамилия: subs.surname, имя отца: subs.fathername,национальность: subs.nationality, passportNo: subs.passportNo, birthdate: subs.birthdate}) "</p>

Я хочу создать / объединить узлы и отношения, типами которых являются Person, Subscription и Line

Если бы у меня была такая же подписка, я должен проверить startDate, если дата начала новых данных больше старых данных;Я должен создать новую подписку, а также изменить дату окончания старой подписки.

UNWIND  [{
msisdn:'99658321564',
name:'Lady',
surname:'Camble',
fatherName:'Aeron',
nationality:'EN',
passportNo:'PN-1234224',
birthDate:'12-05-1979',
nationalIdentityNumber:'112124224',
subscriptionId:'2009201999658321564',
startDate:'20-09-2019 12:00:12'
},{msisdn:'99658363275',
name:'John',
surname:'Mckeen',
fatherName:'Frank',
nationality:'EN',
passportNo:'PN-126587',
birthDate:'15-08-1998',
nationalIdentityNumber:'2548746542',
subscriptionId:'1506201999658363275',
startDate:'15-06-2019 13:00:12'}
{
msisdn:'99658321564',
name:'Lady',
surname:'Camble',
fatherName:'Aeron',
nationality:'EN',
passportNo:'PN-1234224',
birthDate:'12-05-1979',
nationalIdentityNumber:'112124224',
subscriptionId:'2009201999658321564',
startDate:'31-11-2019 12:00:12'
}
] as subs
MERGE (y:Person {nationalIdentityNumber: subs.nationalIdentityNumber, name:         subs.name, surname: subs.surname, fathername: subs.fathername , nationality: subs.nationality, passportNo: subs.passportNo, birthdate: subs.birthdate  })
MERGE (t:Subscription{subscriptionId:subs.subscriptionId })
MERGE (y)-[rel:ASSOCIATION]-(t)
ON MATCH SET
t.endDate = (case when t.startDate <subs.startDate then subs.startDate else '' 
end) 
MATCH (t:Subscription) where t.subscriprionId=subs.subscriprionId and
(CASE
WHEN  t.endDate=subs.startDate then 
CREATE (z:Subscription{ subscriptionId: subs.subscriptionId, startDate: subs.startDate, endDate:''})-[r:ASSOCIATION]-(y:Person {nationalIdentityNumber: subs.nationalIdentityNumber, name: subs.name, surname: subs.surname, fathername: subs.fathername , nationality: subs.nationality, passportNo: subs.passportNo, birthdate: subs.birthdate})
END)
 RETURN y

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Вы пытаетесь получить условные предложения Cypher через оператор CASE, но это не сработает. Вы не можете использовать вложенный оператор CREATE (или любое другое предложение Cypher) в CASE.

Однако вы можете использовать трюк с FOREACH и CASE , чтобы имитировать условное выражение if. Это должно работать в вашем случае, так как вы хотите выполнять CREATE только при определенных условиях (хотя, поскольку вы уже сопоставились с узлом y для данного лица, просто повторно используйте (y) в этом CREATE вместо попытки определить весь узелснова из меток и свойств, которые не будут работать должным образом).

Если вам нужна более продвинутая условная логика, она доступна через условных процедур в процедурах APOC

0 голосов
/ 31 октября 2019
UNWIND[...] as subs
MERGE (y:Person {nationalIdentityNumber: subs.nationalIdentityNumber, name: subs.name, surname: subs.surname, fatherName: subs.fatherName , nationality: subs.nationality, passportNo: subs.passportNo, birthDate: subs.birthDate  })
MERGE (t:Subscription{subscriptionId:subs.subscriptionId,startDate:subs.startDate,endDate:''})
MERGE (y)-[rel:ASSOCIATION]-(t)
MERGE(x:Subscription{subscriptionId:subs.subscriptionId, endDate:''})
SET
x.endDate = (case when x.startDate < subs.startDate then subs.startDate else null end);

CQL должен понравиться. Спасибо моему коллеге.

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