【发布时间】:2012-12-02 14:21:03
【问题描述】:
我有一个表,里面有一些 RDF 语句,比如Quads(graph, subject, verb, object),我发现自己在做这样的查询:
select * from quads where verb = 'rdf:type' and object = 'smtg:Type'
select * from quads where verb = 'rdf:label' and object = 'bla bla'
我想以这样的形式表达这一点
select * from quads where type('smtg:Type')
select * from quads where label('bla bla')
虽然这似乎是一个“微不足道的”文本替换,但我不知道如何以及是否可以在 postgresql 中实现,尽管我有点认为这是不可能的。
据我所知,我可以使用函数对常量进行硬编码,然后
select * from quads where rdftype() = verb and object = 'smtg:Type'
或者我可以使用函数作为from 参数,例如
select * from typed('smtg:Type')
遗憾的是,前者相当冗长,而后者似乎无法修改为组合,例如我不能做一个假设
select * from quads where type('smtg:Type') and inGraph('mygraph')
有没有办法做我想做的事?这似乎不可能,但我想知道有没有办法。
编辑:一个 sqlfiddle 实例:http://sqlfiddle.com/#!1/40b2c/3。
更清楚地说,这似乎不可行的原因是宏函数将返回一个布尔值(它在where 子句中使用,就好像它在select $1=somevalue 的位置一样)但使用“隐式”行参数,它将一次访问多个字段,我在 pg 文档中没有看到这样的例子。
【问题讨论】:
-
我看不出为什么不能在 PL/pgSQL 函数中完成。但可以肯定的是,我们需要更多信息。请发布确切的表结构(如
create table...)和一些示例数据(如insert into ...),您可以在sqlfiddle.com发布带有前两个语句的工作副本 -
如果
verb在功能上依赖于object,那么您应该删除冗余列并规范化您的架构。verb上的附加条件在object上的条件旁边是多余的。如果verb不能从object推导出来,那么仍然不清楚你如何解决type('#Person')。一般来说,您几乎可以在 plpgsql 中做任何事情。当您遇到无法用普通 SQL 解决的问题时,请在 plpgsql 函数中生成 动态 SQL。在 SO 上搜索[plpgsql] EXECUTE或dynamic-sql以获取更多信息。 -
verb在功能上不依赖于对象。我不明白你所说的“解决”是什么意思,很抱歉,type('#Person')将等同于verb_and_object_equals_to('type', '#Person')固定一个参数。
标签: function postgresql database stored-functions