4

我有一个表,里面有一些 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子句中使用,就好像它 where a select $1=somevalue)但使用它可以访问的“隐式”行参数一次多个字段,我在 pg 文档中没有看到这样的例子。

4

1 回答 1

3

并且后一个 [function] 似乎不能修改为组合,例如我不能做一个假设

只要返回类型是稳定的,你就可以在 plpgsql 函数中做任何事情。

您没有透露如何解决type('smtg:Type')inGraph('mygraph')- 这些应该是功能吗?返回..什么?
但是对于这样一个简单的情况,即使是一个普通的 SQL 函数也应该可以完成这项工作:

CREATE OR REPLACE FUNCTION f_foo (_type text, _graph text DEFAULT NULL)
  RETURNS SETOF quads AS
$func$
   SELECT *
   FROM   quads
   WHERE  CASE WHEN $1 IS NOT NULL THEN ... ELSE ... END
   AND    CASE WHEN $2 IS NOT NULL THEN ... ELSE ... END
   ORDER  BY ...;
$func$  LANGUAGE sql;

在 PostgreSQL 9.2 或更高版本中,您还可以在 SQL 函数中使用参数名称而不是位置参数 ( $1, $2, ..)。

称呼:

由于我为第二个参数定义了 DEFAULT,因此您可以使用一个两个参数调用此函数:

SELECT * FROM f_foo('smtg:Type');

或者:

SELECT * FROM f_foo('smtg:Type', 'mygraph');
于 2012-12-02T15:39:46.883 回答