改进我的SPARQL查询

时间:2015-02-11 04:31:40

标签: sparql owl protege

我正在研究关于托尔金精灵家族分支的本体论。 Here是OWL文件。

现在我在Protégé中添加了SPARQL选项卡的前缀,如下所示:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX gene: <http://www.semanticweb.org/kayurin/ontologies/2015/1/casata_di_finwe#>

然后开始处理我的第一个查询,第一个成功的查询是:

SELECT ?Prole
WHERE 
{
?x gene:nomeCompleto ?Prole;
gene:haGenitore gene:Finwe.
}

这意味着在“Prole”(Offspring)列下返回我的数据属性NomeCompleto(我使用的字符串值,因为不确定如何使用个性化类的成员中的特殊字符。)对于所有成员拥有haGenitore Finwe财产的“个人”(人)类(Has Finwe作为父母。)。

它有效,但感觉有点过于冗长,但(同时)。这是我处理其他相关查询的良好基础:

SELECT ?FigliMaschi
WHERE 
{
?x gene:nomeCompleto ?FigliMaschi;
gene:haGenitore gene:Finwe;
gene:haSesso gene:MaschioSesso.
}

成功地将“Ol Finwe”的男孩子的所有NomeCompleto字符串都归还给我。

现在,我的第一个问题是:

字符串以完全格式返回给我。 “[insertnamehere]”@

他们有“”和@,我不知道他们来自哪里。

第二个问题:

我尝试了进化的查询:

SELECT ?Prole
WHERE 
{
?x gene:nomeCompleto ?Prole;
gene:haGenitore gene:Finwe;
gene:haSesso gene:MaschioSesso.
?y gene:nomeCompleto ?FiglieFemmine;
gene:haGenitore gene:Finwe;
gene:haSesso gene:FemminaSesso.
}

这个想法是获得两个专栏,一个是儿子,另一个是我们多产精灵的女儿。

确实如此,但是男性列中的名称被复制三次,而女性列中的名称被复制两次,因此两列中的条目数相等。

没有办法解决这个问题?

第三个问题:

我想得到两个专栏:Padre和Figli,第一个应该是Finwe的名字,第二个是他的后代。

查询是:

SELECT ?Padre ?Figli
WHERE
{
?a gene:nomeCompleto ?Padre;
gene:Finwe.
?x gene:nomeCompleto ?Figli;
gene:haGenitore gene:Finwe.
}

不起作用,空场。

最后,我想通过在nomeFormale和nomeComune中拆分nomeCompleto来改进数据属性(为列表的每个成员添加第二个名称。)我试图做一个会返回nomeCompleto两次的查询,但是只有一个工作是这样的:

SELECT ?Nome1 ?Nome2
WHERE 
{
?x gene:nomeCompleto ?Nome1;
gene:haGenitore gene:Finwe.
?y gene:nomeCompleto ?Nome2;
gene:haGenitore gene:Finwe.
}

即使这样,列表也是一团糟。

任何可以帮助解决这个问题的人?

提前感谢所有人。

备注:

我正在使用Protégé5.0beta。 (唯一适用于我的电脑的版本。) HermiT 1.3.8.3作为推理者。 Java版本8更新31 Windows 8.1 64位

1 个答案:

答案 0 :(得分:2)

我认为你真的需要阅读SPARQL。你应该停止思考它是否是一个数据库。

  1. NomeCompleto是String类型的数据属性。这就是您将第一个查询的结果视为字符串变量的原因。
  2. 您可以创建两个查询的并集,这样您就会有一些空单元格,但不会重复。

    SELECT distinct ?Prole ?FiglieFemmine WHERE { {?x gene:nomeCompleto ?Prole; gene:haGenitore gene:Finwe; gene:haSesso gene:MaschioSesso. } Union{ ?y gene:nomeCompleto ?FiglieFemmine; gene:haGenitore gene:Finwe; gene:haSesso gene:FemminaSesso. } }

  3. 首先你的查询不完整,你错过了一个我认为是haProle的属性。所以你需要找到所有与他们的父亲的人,然后根据你的父亲过滤他们。像这样:

    SELECT distinct * WHERE { ?padre gene:haProle ?figili. ?padre gene:nomeCompleto ?n1. ?figili gene:nomeCompleto ?n2. Filter (?padre=gene:Finwe) }

  4. 如果你想要返回两次(同样的东西)你需要使用相同的对象(在你的查询x中)。我真的不确定你想做什么,但这就是如何获得两次名字。

    SELECT ?Nome1 ?Nome2 WHERE { ?x gene:nomeCompleto ?Nome1; gene:haGenitore gene:Finwe. ?x gene:nomeCompleto ?Nome2; gene:haGenitore gene:Finwe. }