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

Sparql 如何根据RDF中的条件选择属性,sparql,rdf,owl,semantic-web,rdfs,Sparql,Rdf,Owl,Semantic Web,Rdfs,在下面的RDF示例中,我希望根据一个条件获得一个属性的值。 情况如下: PREFIX ex:<http://ww....ex#> SELECT ?mail ?refProp ?payer WHERE { { SELECT ?mail ?refProp WHERE { ?mail ex:paymentType / ex:referProperty ?refProp. } }

在下面的RDF示例中,我希望根据一个条件获得一个属性的值。 情况如下:

PREFIX ex:<http://ww....ex#>
SELECT ?mail ?refProp ?payer
WHERE
{
    {
        SELECT ?mail ?refProp
        WHERE
        {
            ?mail ex:paymentType / ex:referProperty ?refProp.
        }
    }
    ?mail ?refProp ?payer.
}
  • 如果property
    refereproperty
    的值是
    “ex:sender”
    ,那么我将获得property
    ex:sender
    的值
  • 如果property
    refereproperty
    的值是
    “ex:receiver”
    ,那么我会得到property
    ex:receiver
    的值
@前缀ex:。
@前缀xsd:。
例:邮件1
例如:发送方“John”^^xsd:string;
例如:接收方“账单”^^xsd:string;
例:付款类型例:付款类型1。
例:邮件2
例如:发送方“Jack”^^xsd:string;
例如:接收器“Tom”^^xsd:string;
例:付款类型例:付款类型2。
例:付款类型1
例如:paymentTypeDescription“预付”^^xsd:string;
ex:refereProperty“ex:sender”^^xsd:string。
例:付款类型2
例如:paymentTypeDescription“COLLECT”^^xsd:string;
ex:refereProperty“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.
}
前缀ex:
选择“邮件”refProp“付款人”
哪里
{
{
选择“邮件”参照属性
哪里
{
?邮件ex:paymentType/ex:referProperty?refProp。
}
}
?邮件?参考项目?付款人。
}
可以通过Sparql获取一个值。但我怀疑使用上述RDF样本和Sparql的方式是不规则的,因为它似乎扩展到了一阶谓词逻辑之外。 使用从文字节点获取的值作为变量来搜索属性是不规则的。理论上,属性“ex:refereProperty”应该在RDFS中定义。
你这样认为吗?如果您这样认为,请教我一种常规方法,包括正确的RDF和正确的Sparql

选项1

可以使用和将URI转换为字符串,反之亦然:

前缀ex:
选择?邮件?str?付款人{
?邮件?p?付款人;例如:paymentType/ex:referProperty?str。
过滤器(替换(str(?p),str(ex:),“ex:”=?str)
}

前缀ex:
选择?邮件?str?付款人{
?邮件?p?付款人;例如:paymentType/ex:referProperty?str。
筛选器(URI(替换(?str,“ex:”,str(ex:))=?p)
}
选项2

您可以使用和实现您的条件:

前缀ex:
选择?邮件?str?付款人{
?邮件ex:paymentType/ex:referProperty?str。
绑定(如果(?str=“ex:sender”,ex:sender,ex:receiver)为?p)
邮寄付款人。
}
选项3

使用:

前缀ex:
选择?邮件?str?付款人{
值(?str?uri){(“ex:sender”ex:sender)(“ex:receiver”ex:receiver)}
?邮件?uri?付款人;例如:paymentType/例如:referProperty?str。
}
选项4

正如Damyan Ognyanov所说,您可以在引用数据中使用URI而不是字符串,即。e
ex:sender
而不是
“ex:sender”
等。然后您的查询将简单如下:

前缀ex:
选择?邮件?str?付款人{
?邮件?uri?付款人;ex:paymentType/ex:referProperty?uri。
}
更新

发件人:

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

发件人:

RDF图的节点集是图中三元组的主题和对象集。
谓词IRI也可能作为节点出现在同一个图中

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

我不明白……给定样本数据,预期结果是什么?“使用从文本节点获取的值作为变量来搜索属性是不规则的”是什么意思?“理论上,属性”ex:refereProperty“应该在RDFS中定义”,你想说什么呢?如果是一个文本,为什么不简单地使用属性的IRI呢?例如,“ex:referProperty ex:sender.”而不是“ex:referProperty”ex:sender“^^xsd:string.”答案也可以在“谢谢你教我好Sparql”找到。你的想法会使我的问题变得简单。但是,我的问题没有解决。我的问题的核心是“它似乎扩展到了一阶谓词逻辑之外”。我是这样想的。-
Ex:sender
因为URI在
Ex:mail1 Ex:sender“John”^^xsd:string
中定位为属性,在
Ex:paymentType1 Ex:refereproperty Ex:receiver
中定位为对象,但属性只能在RDFS中定位为主题或对象。在一个RDF矛盾中,是否使用
ex:sender
作为属性和对象?在RDF中使用
ex:sender
作为URI会使RDF和RDF之间的边界变得可疑。使用
“ex:sender”
作为字符串也有类似的问题。RDF标准中没有任何内容禁止将URI用作三元组的主语或宾语,同时将其用作谓词。即使是极少数的一个RDF蕴涵也意味着,如果a:p用作谓词,那么(:p RDF:type RDF:Propery)。参见第8.1.1节的第二个示例。非常感谢。我完全明白。我阅读了RDF1.1语义第8.1.1节中的第二个示例。我的问题解决了。@HisashiSakai,也许你只需要RDF概念的第3.1节:“谓词IRI也可能作为同一个图中的节点出现。”我已经更新了我的答案。