如何根据 RDF 中的条件 select a 属性
How to select a property according to a condition in RDF
在下面的 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的方式是不规则的,因为它似乎扩展到了一阶谓词逻辑之外。
使用从文字节点获取的值作为变量来搜索 属性 是不规则的。理论上,RDFS中应该定义属性”ex:referProperty”。
你这么认为吗?如果你这么认为,请教我一个包括正确的 RDF 和正确的 Sparql 的常规方法。
选项 1
可以使用 STR()
, IRI()
and 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
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 所说,您可以在参考数据中使用 URI 而不是字符串,即。 e. ex:sender
而不是 "ex:sender"
等。那么您的查询将简单如下:
PREFIX ex: <http://www.example.org#>
SELECT ?mail ?str ?payer {
?mail ?uri ?payer; ex:paymentType/ex:referProperty ?uri.
}
更新
来自 :
Isn’t using ex:sender
as property and object in one RDF contradiction? Using ex:sender
as URI in RDF makes the border between RDF an RDFS dubious.
来自 RDF 1.1 Concepts and Abstract Syntax:
The set of nodes of an RDF graph is the set of subjects and objects of triples in the graph.
It is possible for a predicate IRI to also occur as a node in the same graph.
在 RDF 中,"properties"(或者说它们的 "types")是第一个 class 个对象。
RDFS 与其说是模式,倒不如说是一个词汇表(它引入了例如 rdf:Property
的概念)。
RDF中"ABox"和"TBox"没有明确的区别。
在下面的 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的方式是不规则的,因为它似乎扩展到了一阶谓词逻辑之外。 使用从文字节点获取的值作为变量来搜索 属性 是不规则的。理论上,RDFS中应该定义属性”ex:referProperty”。 你这么认为吗?如果你这么认为,请教我一个包括正确的 RDF 和正确的 Sparql 的常规方法。
选项 1
可以使用 STR()
, IRI()
and REPLACE()
:
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
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 ex:sender
而不是 "ex:sender"
等。那么您的查询将简单如下:
PREFIX ex: <http://www.example.org#>
SELECT ?mail ?str ?payer {
?mail ?uri ?payer; ex:paymentType/ex:referProperty ?uri.
}
更新
来自
Isn’t using
ex:sender
as property and object in one RDF contradiction? Usingex:sender
as URI in RDF makes the border between RDF an RDFS dubious.
来自 RDF 1.1 Concepts and Abstract Syntax:
The set of nodes of an RDF graph is the set of subjects and objects of triples in the graph.
It is possible for a predicate IRI to also occur as a node in the same graph.
在 RDF 中,"properties"(或者说它们的 "types")是第一个 class 个对象。
RDFS 与其说是模式,倒不如说是一个词汇表(它引入了例如 rdf:Property
的概念)。
RDF中"ABox"和"TBox"没有明确的区别。