我正在研究关于托尔金精灵家族分支的本体论。 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位
答案 0 :(得分:2)
我认为你真的需要阅读SPARQL。你应该停止思考它是否是一个数据库。
您可以创建两个查询的并集,这样您就会有一些空单元格,但不会重复。
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.
}
}
首先你的查询不完整,你错过了一个我认为是haProle的属性。所以你需要找到所有与他们的父亲的人,然后根据你的父亲过滤他们。像这样:
SELECT distinct *
WHERE
{
?padre gene:haProle ?figili.
?padre gene:nomeCompleto ?n1.
?figili gene:nomeCompleto ?n2.
Filter (?padre=gene:Finwe)
}
如果你想要返回两次(同样的东西)你需要使用相同的对象(在你的查询x中)。我真的不确定你想做什么,但这就是如何获得两次名字。
SELECT ?Nome1 ?Nome2
WHERE
{
?x gene:nomeCompleto ?Nome1;
gene:haGenitore gene:Finwe.
?x gene:nomeCompleto ?Nome2;
gene:haGenitore gene:Finwe.
}