RESTful 过滤和查询中的布尔逻辑

Posted

技术标签:

【中文标题】RESTful 过滤和查询中的布尔逻辑【英文标题】:Boolean logic in RESTful filtering and queries 【发布时间】:2014-11-03 03:16:54 【问题描述】:

这是someone else's question 关于过滤/查询汽车列表的后续行动。那里对 RESTful 过滤请求的建议是将过滤器表达式放在 URI 的查询中,如下所示:

/cars?color=blue&type=sedan&doors=4

没关系。但是如果我的过滤查询变得更加复杂,我需要使用布尔运算符,例如:

((color=blue OR type=sedan) AND doors=4) OR color=red

也就是说,我想找一辆蓝色的四门车或四门轿车,但如果车是红色的,我就买它,而不关心其他任何属性。

在 RESTful URI 的查询参数中提供布尔表达式是否有任何约定?我想我可以通过创建一些新的查询表达式语言并将其放在POST 中,但这似乎是一种繁重且专有的方法。其他人是如何解决这个问题的?

【问题讨论】:

Odata 有逻辑运算符,虽然我不喜欢它的语法 docs.oasis-open.org/odata/odata/v4.0/… 【参考方案1】:

尝试使用 1 表示真,0 表示假。

/_api/web/lists/getbytitle('XYZ')/items?$filter=Active eq 1

【讨论】:

【参考方案2】:

完全可以用

/cars/color:blue/type:sedan/doors:4

而不是

/cars?color=blue&type=sedan&doors=4

URL 标准仅规定路径应包含分层部分,而查询应包含非分层部分。由于这是一个 map-reduce,因此使用 / 是完全有效的。

在您的情况下,您需要一种查询语言来描述您的过滤器。如果我是你,我会复制一个已经存在的解决方案,例如具有 REST API 的 noSQL 数据库的查询语言。

我认为resource query language 是您所需要的。我想你可以这样使用它:

 /sthg?q="(foo=3|foo=bar)&price=lt=10"

或者忘记默认的 queryString 解析器,像这样:

    /sthg?(foo=3|foo=bar)&price=lt=10

我建议您阅读手册以了解更多详细信息。

由于我没有找到其他与 URL 兼容的查询语言(目前),我认为唯一的其他选择是序列化另一种查询语言并将其以参数形式发送,例如 SparSQL

 http://localhost:8003/v1/graphs/sparql?query=your-urlencoded-query

marklogic7。 Hydra 在其词汇中定义了freeTextQuery,因此它们遵循相同的方法。但我会问马库斯这件事。这是一个复杂的话题,因为根据自描述消息约束,您应该在某处描述您在 URL 中使用的查询语言类型。我不确定这一点。 :S

结论:

为了支持即席搜索查询,我们需要一种标准方式在链接元数据中描述它们。目前,这方面的标准很少。使用最广泛的标准是URI templates,据我所知,它不支持嵌套语句、运算符等。有一个名为link descriptions 的草稿试图填补空白,但它并不完整。

一种可能的解决方法是使用单个 q 参数定义 URI 模板,该参数具有 x:SearchQuery 的 rdf:type 和 xsd:string 的 rdfs:range,并创建另一个关于如何描述此类 x:SearchQuery 的词汇。之后,描述可用于构建搜索表单,并验证发送到服务器的查询。这种方法也可以支持已经存在的查询,因此我们不需要新的查询。

所以这个问题可以通过词汇或新的 URI 模板标准来解决。

【讨论】:

我对 rql 寄予厚望,但persvr.org/rql 的“文档”并不是真正的规范——它只不过是一组示例。而且只有一个 javascript 实现。 (参考实现不能很好地替代文档,有时甚至更糟。)我留下了以下问题:我如何(甚至可以?)使用嵌入了 : 字符的变量(例如前缀为 RDF变量example:foo)?我如何(甚至可以?)使用自定义类型?你让我充满希望,但 rql 似乎还没有准备好在 Persevere 之外进行一般使用。 我刚刚找到了 RQL,我会检查一下,也许会尝试为它编写一个 php 解析器以供个人使用。你的问题很好。我们需要一种查询语言,这是肯定的。如果你找到合适的,请在这里写评论! 是的,查看了 SPARQL,谢谢。我可能不得不 POST 它而不是将其包含在 URI 查询中。但事实证明,SPARQL 对于我想要的来说过于宽泛,主要集中在整个 RDF 三元组数据库上。 我认为您可以使用任何查询语言并以序列化格式将其发送到 queryString 中...您所需要的只是一个解析器,并遍历 + 验证输出数据结构以构建内部查询你的系统。我找不到除 RQL 之外的其他 URL 查询语言,但我只搜索了大约一个小时...... np :-) 顺便说一句,这里现在有一个类似的主题:***.com/questions/25766327/…【参考方案3】:

我看到很多人使用您提供的查询字符串 - 很像 SQL 查询字符串。

这里只是两个例子:

Socrata(开放数据门户公司)的 SoQL(SQL 变体):http://dev.socrata.com/consumers/cookbooks/querying-block-ranges.html openFDA(来自 fda.gov 的开放数据 API)使用类似的基于字符串的查询参数映射到 ElasticSearch 查询,我相信:https://open.fda.gov/api/reference/#query-syntax

【讨论】:

以上是关于RESTful 过滤和查询中的布尔逻辑的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch 过滤布尔查询

php url/rest 布尔逻辑解析器

Elasticsearch (DSL 布尔查询 过滤器 排序 高亮显示

ElasticSearch - 布尔查询过滤器问题

用于过滤的多个资源上的 RESTful API 多个查询字符串

哪些搜索引擎完全支持布尔检索?