我是新手,正处于本体论和SPARQL查询的学习阶段。我在Semaphore中有一个现有的本体,我想使用regex选择特定的三元组,并将它们放在一个新的类下。
id被安排在如下所示的本体中(在Semaphore中(。
-->DummyOnto
QR1
NC1
QR2
QR3
NC2
UZ1
UZ2
UZ3
我有以下SPARQL查询,以选择以QR和NC开头的三元组,这两个查询运行良好。
SELECT * WHERE
{
{?s ?p ?o .
filter regex(str(?s), "http://aaaaaa/sssss/eeeeee#QR-").
}
union
{?s ?p ?o .
filter regex(str(?s), "http://aaaaaa/sssss/eeeeee#NC").
}
}
LIMIT 100
我想把它们分为不同的类别,如下所示。
-->DummyOnto
---->ClassA
QR1
NC1
QR2
QR3
NC2
---->ClassB
UZ1
UZ2
UZ3
非常感谢您的帮助。
此SPARQL UPDATE查询为在WHERE
:内找到的所有?s
插入在INSERT
内指定的三元组
INSERT {
?s a :ClassA .
}
WHERE {
?s ?p ?o .
FILTER (
STRSTARTS(STR(?s), "http://aaaaaa/sssss/eeeeee#QR")
||
STRSTARTS(STR(?s), "http://aaaaaa/sssss/eeeeee#NC")
) .
}
如果所有?s
都具有某个属性,则指定该属性而不是?p
会提高性能。
进一步更改:
- 而不是
REGEX
:STRSTARTS
- 而不是
UNION
:||
("或"(在FILTER
内部
如果性能有问题,您可以测试此变体,它使用子查询,以便可以指定SELECT
:
INSERT {
?s a :ClassA .
}
WHERE {
{
SELECT ?s
WHERE {
?s ?p ?o .
FILTER ( STRSTARTS(STR(?s), "http://aaaaaa/sssss/eeeeee#QR") || STRSTARTS(STR(?s), "http://aaaaaa/sssss/eeeeee#NC") ) .
}
}
}