完善我的 SPARQL query-ing

Refining my SPARQL query-ing

我正在写一篇关于托尔金精灵家族分支的 Ontology。 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.
}

这意味着 return 我,在 "Prole" 列(后代)下数据 属性 NomeCompleto(我使用的字符串值,因为不确定是否使用特殊字符Individuo Class.) 的所有成员 class "Individuo" (Person) 拥有 属性 haGenitore Finwe (Has Finwe as a parent .).

它有效,感觉有点太罗嗦了,但(同时)它是我处理其他相关查询的良好基础,例如:

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

这成功地 return 为我提供了 'ol Finwe 的男性 children 的所有 NomeCompleto 字符串。

现在,我的第一个问题:

这些字符串是 return 以这种 精确 格式提供给我的。 “[在此处插入名称]”@

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

第二题:

我尝试了进化的查询:

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 来改进数据属性(为列表的每个成员添加第二个名称。)我尝试进行一个查询,将 return nomeCompleto 两个次,但唯一有效的是:

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

即便如此,列表还是一团糟。

有人可以帮忙解决这个问题吗?

在此先感谢大家。

备注:

我正在使用 Protégé 5.0 测试版。 (唯一适用于我的电脑的版本。) HermiT 1.3.8.3 作为 Reasoner。 Java 版本 8 更新 31 Windows8.1 64 位

我认为您确实需要阅读 SPARQL。你应该停止认为它是一个数据库。

  1. NomeCompleto 是字符串类型的数据 属性。这就是您将第一个查询的结果视为字符串变量的原因。
  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. 如果你想 return 两次(同一件事)你需要使用同一个对象(在你的查询 x 中)。我真的不知道你想做什么,但这是两次获得名字的方法。

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