Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化我的SPARQL查询_Sparql_Owl_Protege - Fatal编程技术网

优化我的SPARQL查询

优化我的SPARQL查询,sparql,owl,protege,Sparql,Owl,Protege,我正在研究一个关于托尔金精灵家族分支的本体论。是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:

我正在研究一个关于托尔金精灵家族分支的本体论。是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#>
它的意思是在“Prole”(后代)列下返回我的数据属性NomeCompleto(我使用的字符串值,因为我不确定是否为Individuo类的成员在中使用specialcase字符)。对于所有拥有属性haGenitore Finwe(将Finwe作为父级)的类“Individuo”(Person)的成员

它可以工作,感觉有点太冗长,但(同时)它是我处理其他相关查询的良好基础,如:

SELECT ?FigliMaschi
WHERE 
{
?x gene:nomeCompleto ?FigliMaschi;
gene:haGenitore gene:Finwe;
gene:haSesso gene:MaschioSesso.
}
它成功地返回了ol Finwe的男性孩子的所有字符串

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

字符串以这种精确的格式返回给我。“[此处插入名称]”@

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

第二个问题:

我尝试了演化查询:

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,第一个应该叫just 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.0测试版。(我的电脑上唯一可用的版本) 隐士1.3.8.3作为推理者。 Java版本8更新31
Windows 8.1 64位

我认为您确实需要了解SPARQL。你应该停止把它当作一个数据库

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

    选择不同的?Prole?FiglieFemmine
    哪里
    {
    {?x基因:nometo?Prole;
    基因:haGenitore基因:Finwe;
    基因:haSesso基因:MaschioSesso。
    }
    联合{
    y基因:nomeCompleto?FiglieFemmine;
    基因:haGenitore基因:Finwe;
    基因:haSesso基因:FemminaSesso。
    }
    }

  • 首先,您的查询是不完整的,您缺少一个我认为是happrole的属性。所以你需要找到所有有父亲的人,然后根据你心目中的父亲对他们进行筛选。大概是这样的:

    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#>
    
    选择distinct*
    哪里
    {
    ?padre基因:单倍体?菲吉利。
    ?padre基因:nomeCompleto?n1。
    figili基因:nomeCompleto?n2。
    过滤器(?padre=基因:Finwe)
    }

  • 如果要返回两次(相同的内容),则必须使用相同的对象(在查询x中)。我真的不知道你想做什么,但这是如何得到一个名字两次

    选择?Nome1?Nome2
    哪里
    {
    ?x基因:nomeCompleto?Nome1;
    基因:哈格尼托雷基因:芬威。
    ?x基因:nomeCompleto?Nome2;
    基因:哈格尼托雷基因:芬威。
    }


  • 语言标记的RDF文本具有词法形式和语言标记。例如,我的名字可以表示为“约书亚·泰勒”@en。这是字符串“Joshua Taylor”,语言是英语。这是你应该期待的结果。如果你有三个不同的问题,你应该问三个不同的问题。Stack Overflow是为了帮助所有遇到类似问题的人,而将这样的问题组合在一起会更难找到单独的问题和答案。对于第二个问题,您只需执行
    select?son?daugher where{{{…sons query…}union{…daugher query…}
    。对于组合问题,我深表歉意,我担心如果我在一个单独的线程中发布它们,就会像我一样泛滥\滥发信息。(好吧,举个例子,我不知道“线程”是否适用于这里。)我下次提问时会记住这一点。是的,我正在阅读有关它的资料,但我的大学提供的资料(实际上我在网上也找到了这些资料)让我有点困惑,所以我开始做一些实验,以了解他们所说的话的感受。如果你能告诉我一些你认为有用的资料来源,我将不胜感激。@Kay实际上包括了很多例子。技巧的一部分是在高层次上略读一些东西,然后再细读一些。@Joshua:谢谢,我会的。当我第一次看它的时候,感觉它更多的是针对专家而不是新手,我会尝试按照你的建议去做。