我正在努力创建一个正确的SPARQL查询,它将生成正确的格式,以便我可以在其中打开Protege。我们的本体论是关于鸡尾酒,我们希望在我们的数据库中包含所有DBPedia鸡尾酒,包括成分(dbp:ingredients
)和食谱(dbp:prep
)。在数据库中获取鸡尾酒工作正常,但成分和配方没有。我现在有以下查询:
CONSTRUCT {?drink dct:subject ?category.
?drink dbp:prep ?recipe.
?drink dbp:ingredients ?ingredients.
?drink rdf:type owl:NamedIndividual .
?category rdf:type owl:Class.
dct:subject rdf:type owl:ObjectProperty.
dbp:prep rdf:type owl:ObjectProperty.
dbp:ingredient rdf:type owl:Objectproperty.
}
WHERE {
?drink dct:subject ?category.
?drink dbp:prep ?recipe.
?drink dbp:ingredients ?ingredients.}
由于?成分和?配方现在没有声明,它不会显示在Protege的个人标签中。但是当我将它添加到查询的CONSTRUCT部分时:
?recipe rdf:type owl:NamedIndividual.
?ingredients rdf:type owl:NamedIndividual.
我收到错误:
Virtuoso RDF01错误CONSTRUCT中的错误变量值:“* 5 cL伏特加 * 10 cL橙汁“(标签246框标志0)不是有效主题,只有三元组的对象可以是文字
我认为因为dbpedia上的准备和成分只是一个字符串,没有链接数据。 但是,我如何使这项工作在Protege中显示?
答案 0 :(得分:2)
不可能将文字作为RDF三元组的主题。相反,为配方和成分创建资源+将字符串值附加为rdfs:comment
(或者rdfs:label
)可能是一种解决方法。它的工作原理如下:
CONSTRUCT {
?drink dct:subject ?category.
?drink dbp:prep ?recipe.
?drink dbp:ingredients ?ingredients.
?drink rdf:type owl:NamedIndividual .
?category rdf:type owl:Class.
dct:subject rdf:type owl:ObjectProperty.
dbp:prep rdf:type owl:ObjectProperty.
dbp:ingredients rdf:type owl:Objectproperty.
# add string values as rdfs:comment
?recipe rdfs:comment ?recipe_str .
?ingredients rdfs:comment ?ingredients_str
}
WHERE {
?drink dct:subject ?category.
?drink dbp:prep ?recipe_str.
?drink dbp:ingredients ?ingredients_str.
BIND(URI(CONCAT("http://dbpedia.org/resource/recipe", MD5(STR(?recipe_str)))) as ?recipe)
BIND(URI(CONCAT("http://dbpedia.org/resource/ingredients", MD5(STR(?ingredients_str)))) as ?ingredients)
}
注意,如果配方(分别为成分)已经是资源,它会以某种方式失败。它不适用于DBpedia上的dbp:prep
和dbp:ingredients
,但一般情况下,如果您不确定并且您有一些rdf:Property
实际上允许资源和文字,那么需要妥善处理,例如使用IF-ELSE
构造:
BIND(IF(isLiteral(?recipe_str), URI(CONCAT("http://dbpedia.org/resource/recipe", MD5(STR(?recipe_str)))), ?recipe_str) as ?recipe)
BIND(IF(isLiteral(?ingredients_str), URI(CONCAT("http://dbpedia.org/resource/ingredients", MD5(STR(?ingredients_str)))), ?ingredients_str) as ?ingredients)
你还必须省略rdfs:comment
三元组,然后确实......