【问题标题】:How to select a property according to a condition in RDF如何根据 RDF 中的条件选择属性
【发布时间】:2018-09-19 04:49:12
【问题描述】:

在下面的 RDF 示例中,我想根据条件获取属性之一的值。 条件如下:

  • 如果属性referProperty 的值是"ex:sender",那么我得到属性ex:sender 的值。
  • 如果属性referProperty 的值为"ex:reciever",则我得到属性ex:reciever 的值。
@prefix ex: <http://www.example.org#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

ex:mail1
  ex:sender "John"^^xsd:string ;
  ex:receiver "Bill"^^xsd:string ;
  ex:paymentType ex:paymentType1 .

ex:mail2
  ex:sender "Jack"^^xsd:string ;
  ex:receiver "Tom"^^xsd:string ;
  ex:paymentType ex:paymentType2 .

ex:paymentType1
  ex:paymentTypeDescription "PREPAID"^^xsd:string ;
  ex:referProperty "ex:sender"^^xsd:string .

ex:paymentType2
  ex:paymentTypeDescription "COLLECT"^^xsd:string ;
  ex:referProperty "ex:receiver"^^xsd:string .

Sparql 获取值如下:

PREFIX ex:<http://ww....ex#>
SELECT ?mail ?refProp ?payer
WHERE
{
    {
        SELECT ?mail ?refProp
        WHERE
        {
            ?mail ex:paymentType / ex:referProperty ?refProp.
        }
    }
    ?mail ?refProp ?payer.
}

可以通过 Sparql 获取值。但我质疑使用上述 RDF 样本和 Sparql 的方式是不规则的,因为它似乎扩展了一阶谓词逻辑之外。 使用从文字节点获取的值作为变量来搜索属性是不规则的。理论上,属性“ex:referProperty”应该在RDFS中定义。 你认为是吗?如果您这么认为,请教我一个常规方法,其中包括正确的 RDF 和正确的 Sparql。

【问题讨论】:

  • 我不明白...给定样本数据的预期结果是什么?什么意思 " 使用从文字节点获取的值作为变量来搜索属性是不规则的。"“理论上,属性”ex:referProperty”应该在RDFS中定义。”
  • 如果是文字,为什么不简单地使用属性的 IRI 呢?例如。 'ex:referProperty ex:sender .'而不是 'ex:referProperty "ex:sender"^^xsd:string .'

标签: sparql rdf owl semantic-web rdfs


【解决方案1】:

选项 1

可以使用STR()IRI()REPLACE() 将URI 转换为字符串,反之亦然:

PREFIX ex: <http://www.example.org#>
SELECT ?mail ?str ?payer {
   ?mail ?p ?payer; ex:paymentType/ex:referProperty ?str.
   FILTER (replace(str(?p), str(ex:), "ex:") = ?str)
}

PREFIX ex: <http://www.example.org#>
SELECT ?mail ?str ?payer {
   ?mail ?p ?payer; ex:paymentType/ex:referProperty ?str.
   FILTER (URI(replace(?str, "ex:", str(ex:))) = ?p)
}

选项 2

您可以使用BINDIF 来实现您的条件:

PREFIX ex: <http://www.example.org#>
SELECT ?mail ?str ?payer {
   ?mail ex:paymentType/ex:referProperty ?str.
   BIND (IF(?str = "ex:sender", ex:sender, ex:receiver) AS ?p)
   ?mail ?p ?payer.
}

选项 3

使用VALUES

PREFIX ex: <http://www.example.org#>
SELECT ?mail ?str ?payer {
    VALUES (?str ?uri) {("ex:sender" ex:sender) ("ex:receiver" ex:receiver)}
    ?mail ?uri ?payer; ex:paymentType/ex:referProperty ?str.
}

选项 4

正如 Damyan Ognyanov 的 suggested,您可以在参考数据中使用 URI 而不是字符串,即。 e. ex:sender 而不是 "ex:sender" 等。那么您的查询将如下所示:

PREFIX ex: <http://www.example.org#>
SELECT ?mail ?str ?payer {
    ?mail ?uri ?payer; ex:paymentType/ex:referProperty ?uri.
}

更新

来自your comment

不是在一个 RDF 矛盾中使用ex:sender 作为属性和对象吗?在 RDF 中使用ex:sender 作为 URI 会使 RDF 与 RDFS 之间的边界变得可疑。

来自RDF 1.1 Concepts and Abstract Syntax

RDF 图的节点集合是图中三元组的主客体的集合。
谓词 IRI 也可能作为节点出现在同一个图中。

在 RDF 中,“属性”(或者更确切地说是它们的“类型”)是一等对象。
RDFS 与其说是模式,不如说是一个词汇表(它引入了例如rdf:Property 的概念)。
RDF中的“ABox”和“TBox”没有明显的区别。

【讨论】:

  • 感谢您教给我好的 Sparql。根据您的想法,我的查询将变得简单。但是,我的问题没有解决。我的问题的核心是用“它似乎延伸到一阶谓词逻辑之外”这句话来表达的。我的想法是这样的。
  • -Ex:sender as URI 在ex:mail1 ex:sender "John"^^xsd:string 中定位为属性,在ex:paymentType1 ex:referProperty ex:receiver 中定位为对象,但属性只能在 RDFS 中定位为主题或对象.不是在一个 RDF 矛盾中使用ex:sender 作为属性和对象吗?在 RDF 中使用ex:sender 作为 URI 会使 RDF 与 RDFS 之间的边界变得可疑。使用"ex:sender"作为字符串也有类似的问题。
  • RDF 标准中没有任何内容禁止将 URI 用作三元组的主语或宾语,同时也将其用作谓词。即使是极少数 RDF 蕴涵之一,也暗示如果将 :p 用作谓词,则 (:p rdf:type rdf:Propery)。请参阅w3.org/TR/2014/REC-rdf11-mt-20140225/… 的第 8.1.1 节中的第二个示例。
  • 非常感谢。我完全明白。我从 RDF 1.1 Semantics 的第 8.1.1 节中阅读了第二个示例。我的问题解决了。
  • @HisashiSakai,也许您只需要 RDF 概念的第 3.1 节:“谓词 IRI 也可能作为同一图中的节点出现。”我'我更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多