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

14

这是对于别人提出的有关过滤/查询汽车列表问题的一种跟进。在那里,建议使用RESTful过滤请求,将过滤表达式放在URI的查询中,就像这样:

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

好的。但是如果我的筛选查询变得更加复杂,我需要使用布尔运算符,例如:

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

换言之,我想找一辆四门蓝色的车或轿车,但如果车是红色的,我会接受它而不关心其他特性。

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


Odata有逻辑运算符,尽管我不喜欢它的语法。http://docs.oasis-open.org/odata/odata/v4.0/odata-v4.0-part2-url-conventions.html - themihai
3个回答

7

使用它是完全没有问题的

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

替代

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

URL标准仅规定路径应包含层次结构部分,查询应包含非层次结构部分。由于这是一个映射-归约过程,因此使用斜杠“/”是完全有效的。
在您的情况下,您需要一种查询语言来描述您的过滤器。如果我是您,我会复制已有的解决方案,例如具有REST API的noSQL数据库的查询语言。
  • I think resource query language is what you need. I think you could use it like this:

     /sthg?q="(foo=3|foo=bar)&price=lt=10"
    
或者忘记默认的queryString解析器,像这样:
    /sthg?(foo=3|foo=bar)&price=lt=10

我建议您阅读手册以获取更多详细信息。
  • Since I found no other URL compatible query language (yet), I think the only other option to serialize another query language and send it in a param, like SparSQL

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

    by marklogic7. Hydra defines a freeTextQuery in its vocab, so they follow the same approach. But I'll ask Markus about this. It's a complicated topic, since according to the self-descriptive messages constraint you should describe somewhere what type of query language you use in the URL. I am not sure about this. :S

结论:

为了支持即席搜索查询,我们需要一种标准的方式在链接元数据中描述它们。目前只有少数标准可以实现这一点。我所知道的最广泛使用的标准是URI模板,它不支持嵌套语句、运算符等等。还有一个名为链接描述的草案试图填补这一空白,但它还不完整。

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

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


我曾对rql寄予厚望,但是http://persvr.org/rql/上的“文档”并不是真正的规范——它只不过是一组示例而已。而且只有JavaScript实现。(参考实现是文档的劣质替代品,有时甚至更糟糕。)我还有一些问题,比如:我怎样才能(或者我是否能够)使用带有嵌入式`:`字符的变量(例如RDF前缀变量`example:foo`)?我怎样才能(或者我是否能够)使用自定义类型?你让我充满了希望,但是rql似乎还没有准备好在Persevere之外被广泛使用。 - Garret Wilson
我刚发现了RQL,我会去看看它,也许会尝试为个人使用编写一个PHP解析器。你的问题很好。我们需要一种查询语言,这是肯定的。如果你找到合适的,请在这里留下评论! - inf3rno
好的,我看了一下SPARQL,谢谢。我可能需要将其POST而不是包含在URI查询中。但是SPARQL对于我想要的东西来说太广泛了,主要集中在整个RDF三元组数据库上。 - Garret Wilson
我认为您可以使用任何查询语言并以序列化格式将其发送到queryString中...您所需要的只是一个解析器,并遍历+验证输出数据结构以构建系统中的内部查询。我找不到除RQL之外的其他URL查询语言,但我已经谷歌了一个小时... - inf3rno
np :-) 顺便说一下,现在这里有一个类似的话题:https://dev59.com/p4Pba4cB1Zd3GeqPp0NB - inf3rno
我建议你关注这个讨论:http://lists.w3.org/Archives/Public/public-hydra/2014Sep/0041.html 这可能对你很有趣。我认为目前还没有针对这个问题的REST解决方案。我们目前有URI模板,但它们不能用于这种类型的查询,因此我们需要一个或多个新的标准来描述、构建和验证特定的查询。 - inf3rno

3

-1

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接