我有一个父类“起因”,它有子类“Agging”,“BadLifeStyle”每个类的原因都有一个数据类型属性“name”与个人(Class => Individuals)Reason => Cause_1,Agging => Agging_1,BadLifeStyle => BadLifeStyle_1 我希望得到这样的结果
Ind SubCLassOF type
Agging_1 Causes Agging
BadLifeStyle_1 Causes BadLifeStyle
Cause_1 Causes
我写了这个查询
SELECT *
WHERE {
?cause rdf:type ?typename.
?cause rdfs:subClassOf ?subClass.
OPTIONAL{?cause NS:name ?name.}
FILTER(REGEX(STR(?typename),"Causes","i")
|| REGEX(STR(?subClass),"Causes","i"))
}
它没有给我Cause_1个人
答案 0 :(得分:2)
从语法上讲,你的查询看起来很好,不确定是什么问题...
通常我更喜欢为这种操作执行UNION,在我们的例子中如下:
SELECT *
WHERE {
{
?cause rdf:type ?typename .
FILTER(REGEX(STR(?typename), "Causes", "i"))
} UNION {
?cause rdfs:subClassOf ?subClass .
FILTER(REGEX(STR(?subClass), "Causes", "i"))
}
OPTIONAL{?cause NS:name ?name.}
}
答案 1 :(得分:1)
我正在为RDF和sparql使用virtuoso服务器。 在virtuoso中,我们必须添加一个空格或在OPTIONAL之前输入,然后OPTIONAL将在virtuoso中工作。 所以添加一个空格或输入befor OPTIONAL然后你就能得到结果。 希望这适用于此查询。