【问题标题】:CQL Syntax exceptionCQL 语法异常
【发布时间】:2019-10-31 07:37:02
【问题描述】:

Neo.ClientError.Statement.SyntaxError: 无效输入 ')': 预期 空格或关系模式(第 66 行,第 100 列(偏移量: 1898))“创建(z:订阅{订阅ID:订阅.订阅ID, startDate: subs.startDate, endDate:''})

我想创建/合并类型为 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

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:
    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 应该是这样的。谢谢我的同事。

    【讨论】:

      【解决方案2】:

      您试图通过 CASE 语句来设置条件 Cypher 子句,但这是行不通的。您不能在 CASE 中执行嵌套的 CREATE(或任何其他 Cypher 子句)。

      但是,您可以使用 trick with FOREACH and CASE 来模仿 if 条件。这应该适用于您的情况,因为您只想在某些条件下执行 CREATE(尽管由于您已经与该人的 y 节点匹配,只需在该 CREATE 中重用 (y) 而不是尝试定义整个节点再次从标签和属性,将无法正常工作)。

      如果您需要更高级的条件逻辑,可以通过conditional procs in APOC Procedures 获得

      【讨论】:

        猜你喜欢
        • 2016-09-26
        • 1970-01-01
        • 2013-07-29
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 2013-02-24
        • 2014-06-25
        • 2013-06-04
        相关资源
        最近更新 更多