【问题标题】:How to use a query parameter for ORDER BY?如何使用 ORDER BY 的查询参数?
【发布时间】:2020-07-31 16:29:37
【问题描述】:

我有一个查询,我希望结果按用户确定的字段排序。我希望这不是一个古怪的功能。但我不知道如何在 Neo4J/Cypher 中做到这一点。

这是基本查询:

MATCH (o:SomeThing)
ORDER BY o.id
SKIP 0
LIMIT 20
RETURN o

很简单。当然ORDER BYSKIPLIMIT需要用户提供,所以我们得到这个:

const query = `MATCH (o:SomeThing)
    ORDER BY $order
    SKIP $skip
    LIMIT $limit
    RETURN o`;

session.run(query, { order: 'o.name', skip: 0, limit: 20 });

这适用于跳过和限制,但ORDER BY 不起作用。它可能不起作用,因为order 包含一个字符串,而我们需要一个字段表达式。但是如何将它作为参数传递呢?

这些文档不是很有帮助。听起来这确实是不可能的,但对于如此明显的用例来说,这听起来令人难以置信。那我错过了什么?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    您可以使用dynamic property 语法。

    例如,这应该可以工作:

    const query = "
        MATCH (o:SomeThing)
        ORDER BY o[$propName]
        SKIP $skip
        LIMIT $limit
        RETURN o";
    
    session.run(query, { propName: 'name', skip: 0, limit: 20 });
    

    【讨论】:

    • 这是完美的。我只是觉得这在 Cypher 中是不可能的,但这看起来正是我所需要的。看起来我也可以在 WHERE 子句中使用它,例如:WHERE o[$propname] IN $param
    猜你喜欢
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多