如何根据RDF中的条件选择属性

问题描述 投票:1回答:1

在下面的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的常规方法。

sparql rdf owl semantic-web rdfs
1个回答
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而不是字符串,i。即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”之间没有明显的区别。

© www.soinside.com 2019 - 2024. All rights reserved.