【问题标题】:how to write (union inside optional clause) or (optionals with union clause )?如何编写(可选子句内的联合)或(联合子句的可选)?
【发布时间】:2016-10-08 00:01:06
【问题描述】:

例如为了说明问题,我需要在dbpedia中查询sparql中的一些公司,并获取他们的主页。

其中一些公司有网站,而其他公司有,所以我们必须在 sparql 可选子句中查询,对吗?

为了在我的查询中获取地址,我将其写在可选子句中,如下所示:

...
optional {?company foaf:homepage ?website}

但并不是所有的三元组都使用 foaf:homepage URI 存储网站地址,其中一些三元组使用 dbp:homepage 并且前面的子句如下:

...
optional {?company dbp:homepage ?website}

问题是如何使用 UNION 来获取这两个子句之间的互补数据?

在 dbpedia 中查询人员数据时也会出现同样的问题,例如查询出生日期:

  • 并非所有人在 dpbedia 中都有生日字面值。
  • 有些人的生日在 dbo:birthDate
  • 有些人的生日在 dbp:birthDate

再次,我们需要在可选子句中查询并且需要补充/联合日期。 为了解决这个问题,查询应该是这样的:

optional { {?person dbp:birthDate ?birthdate } union {?person dbo:birthDate ?birthdate} }

或如下:

where { {optional { ?person dbp:birthDate ?birthdate }} union {optional {?person dbo:birthDate ?birthdate}}}

我想我已经接近了,但是我没有成功......直到现在;)

请问如何解决这个问题?

【问题讨论】:

  • 您是否考虑过可选的 { ?company (foaf:homepage | dbp:homepage) ?website}
  • 问题是属性的某些偏好是否应该只显示一个值。这需要一些 IF...ELSE 模式和/或 COALESCE。

标签: union sparql dbpedia


【解决方案1】:

在这样的情况下:

optional {?company foaf:homepage ?website}
optional {?company dbp:homepage ?website}

您可以使用替代属性路径:

optional {?company foaf:homepage|dbp:homepage ?website}

查看Why is this SPARQL query not returning any results?,了解多个绑定相同变量的可选块可能出现的困难之一,以及类似的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    相关资源
    最近更新 更多