Validating rdf:Seq with SPARQL



rdf:Seq是一个RDF属性序列rdf:_1,rdf:_2,rdf:_3

可以使用SPARQL 1.1查询验证吗?例如,如果序列有效,则ASK查询应该返回true,否则返回false

我现在能想到的约束条件:

  • 必须以rdf:_1
  • 开头
  • 无重复属性(rdf:_2,rdf:_2)
  • 没有,求解,序列(rdf:_2,rdf:_4)

我怀疑一个完全通用的解决方案可能是困难的,因为SPARQL中没有递归。但是,验证有限数量的成员(例如30或50)的实用解决方案也是可以接受的。

可以检查是否有一些项目与另一个项目具有相同的位置,或者是否有一个项目没有直接的前身。不幸的是,这需要一些丑陋且昂贵的字符串操作,因此在大型数据集上可能需要更长的时间。该查询忽略了副本可能实际上是相同的(owl:sameAs)。

样本数据:

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
@prefix ex: <http://example.org/>
ex:a a rdf:Seq;
rdf:_1 ex:a1 ;
rdf:_2 ex:a2 .
ex:b a rdf:Bag;
rdf:_1 ex:b1 ;
rdf:_1 ex:b2 .
ex:c a rdf:Alt;
rdf:_2 ex:c1 .
ex:d a rdf:Seq;
rdf:_0 ex:d1 ;
rdf:_1 ex:d2 .

查询:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?container ?containerMembershipProperty ?item ?error WHERE {
{
?container a rdf:Seq .
} UNION {
?container a rdf:Bag .
} UNION {
?container a rdf:Alt .
}
{
BIND("Duplicated Index" AS ?error)
?container ?containerMembershipProperty ?item .
FILTER strstarts(str(?containerMembershipProperty),"http://www.w3.org/1999/02/22-rdf-syntax-ns#_")
FILTER EXISTS {
?container ?containerMembershipProperty ?item2 .
FILTER (?item!=?item2)
}
} UNION {
BIND("Missing Predecessor" AS ?error)
?container ?containerMembershipProperty ?item .
BIND(xsd:integer(STRAFTER(STR(?containerMembershipProperty),"http://www.w3.org/1999/02/22-rdf-syntax-ns#_")) - 1 AS ?index)
BIND(IRI(CONCAT("http://www.w3.org/1999/02/22-rdf-syntax-ns#_", STR(?index))) AS ?previousContainerMembershipProperty)
FILTER (?index >= 1)
FILTER NOT EXISTS {
?container ?previousContainerMembershipProperty ?item3
}
} UNION {
BIND("Illegal Index" AS ?error)
?container ?containerMembershipProperty ?item .
BIND(xsd:integer(STRAFTER(STR(?containerMembershipProperty),"http://www.w3.org/1999/02/22-rdf-syntax-ns#_")) AS ?index)
FILTER (?index < 1)
}
}
ORDER BY ?container ?containerMembershipProperty ?item

结果:

tbody> <<tr>
containercontainerMembershipPropertyitemerror
http://example.org/brdf: _1http://example.org/b1"复制Index"
http://example.org/brdf: _1http://example.org/b2"复制Index"
http://example.org/crdf: _2http://example.org/c1"错过Predecessor"
http://example.org/drdf: _0http://example.org/d1"非法Index"

最新更新