3

在过去几年中,在许多应用程序中,我使用 RDF 作为数据模型并使用 Jena 来管理和查询数据。对于新应用程序,我尝试将应用程序设计为 RESTful,并且应用程序中的 URL 通常在 RDF 中有一些表示。例如:

http://example.com/foo/bar/1/

但是,有时您需要在请求参数中从 servlet 向下钻取或调用 URI:

http://example.com/foo/bar/1/?id=http://example.com/foo/bar/xyz/

URL 变得非常丑陋和不友好,尤其是在编码时:

http://example.com/foo/bar/1/?id=http%3A%2F%2Fexample.com%2Ffoo%2Fbar%2Fxyz%2F

设计中有最佳实践吗?我是否应该在可以查询的 RDF 中创建一个比 URI 更短的单独值?

4

3 回答 3

3

如果您有一组已知或已知的前缀,那么将 URI 缩写为 q-names 是我过去使用的一种模式:

http://example.com/foo/bar/1/?id=example:xyz

链接数据 API中,可以在配置中声明实体的短名称,通常通过说明资源的哪个属性用于表示其短名称(例如:rdfs:labelskos:notation)。因此,该模式是使用少量配置信息通过 RDF 模型本身提供名称缩写。

于 2012-05-14T10:31:12.603 回答
3

首先,在 answers.semanticweb.com 上查看类似的帖子:

您可能需要考虑将资源存储在 SPARQL 端点中,使用以下重写规则使它们可取消引用:

RewriteCond %{HTTP_ACCEPT} (text/turtle|application/rdf+xml)
RewriteRule !^/sparql /sparql?query=CONSTRUCT\s{?s\s?p\s?o}\sWHERE\s{?s\s?p\s?o.\s<%{REQUEST_SCHEME}://%{HTTP_HOST}%{REQUEST_URI}%{QUERY_STRING}>\s?p\s?o} [L,R=303]

我认为通常取消引用 URI 比将 URI 作为查询字符串传递要好得多。根据您的框架,您甚至可以使用 URI 作为域对象的主键(可能在 GRAILS 和 RAILS 上)。

于 2012-05-15T08:02:01.480 回答
0

不确定通常情况下您可以做很多事情。如果您对其他 Web 应用程序感兴趣,则已建立的标准是相对 URL,即针对请求 url 解析 id 参数:

http://example.com/foo/bar/1/?id=/foo/bar/xyz/
http://example.com/foo/bar/1/?id=../xyz/

(根据需要编码)

这有助于提供的示例,因为这两个 url 在同一个域中。否则我想你只需要接受完整的网址。

当然,前缀在 RDF 世界中是常用的,但除非您提供一种查找映射的方法,否则它感觉不是很 RESTful。

于 2012-05-14T10:31:41.917 回答