使用SPARQL在现有本体中创建一个新类



我是新手,正处于本体论和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") ) .
}
}
}