文字作为SPARQL CONSTRUCT查询

时间:2017-10-16 09:30:48

标签: sparql rdf owl ontology protege

我正在努力创建一个正确的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中显示?

1 个答案:

答案 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:prepdbp: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三元组,然后确实......