Neo4j Cypher:在可选/可空参数上匹配节点

Neo4j Cypher:在可选/可空参数上匹配节点,neo4j,cypher,Neo4j,Cypher,我有一个参数“title”,可以定义也可以不定义。如果定义了参数,我希望匹配将该参数作为属性的节点 MATCH (movie:Movie {title: {title}}) 如果没有定义参数,我不想通过该属性进行匹配,而是返回所有电影。也就是说,如果参数存在,我希望通过参数过滤结果。这在一个查询中是可能的吗?更新:这是可能的,请参阅其他答案 我认为这是不可能的。一旦查询编译器找到一个参数,它就会尝试解析它。如果未定义参数,编译器将立即抛出异常-请参阅方法。(如果您通过驱动程序使用Neo4j,这

我有一个参数“title”,可以定义也可以不定义。如果定义了参数,我希望匹配将该参数作为属性的节点

MATCH (movie:Movie {title: {title}})

如果没有定义参数,我不想通过该属性进行匹配,而是返回所有电影。也就是说,如果参数存在,我希望通过参数过滤结果。这在一个查询中是可能的吗?

更新:这是可能的,请参阅其他答案


我认为这是不可能的。一旦查询编译器找到一个参数,它就会尝试解析它。如果未定义参数,编译器将立即抛出异常-请参阅方法。(如果您通过驱动程序使用Neo4j,这将导致另一个异常,例如,对于Java驱动程序,这将导致a。)

您必须有条件地匹配标题。试试这个

MATCH (movie:Movie)
WHERE {title} IS NULL OR movie.title = {title}
还可以考虑在代码中保留条件逻辑并保持查询干净:

MATCH (movie:Movie)
WHERE movie.title =~ {isEmpty(title) ? '.*' : title}

哇!谢谢分享!在带有创建和设置分支的
MERGE
-命令中如何使用此选项?如果设置了参数,它将被覆盖,但如果不是,则应使用旧值。@EmilS。听起来您在寻找Neo4j中的三元(或条件)表达式。没有。有一种方法可以做到这一点,但我强烈建议将您的条件逻辑从查询中移到代码中。如果您真的希望在查询中保留条件逻辑(尽管我有建议),可以使用
CASE
关键字。如果你问一个新问题,并提供一些你正在尝试做的细节,我可以更好地帮助你。(如果您确实创建了一个新问题,请在此处发布链接)@EmilS。基本上,在匹配集matchedNode.var=newvar@EmilS上,如果var为NULL,则使用CASE执行
,否则var将以newvar MERGE()结束。别忘了对你觉得有用的问题和答案进行投票