如何使用SPARQL查询获取本体中最不常见的包含项?

如何使用SPARQL查询获取本体中最不常见的包含项?,sparql,Sparql,如何使用SPARQL查询获取本体中个体的最小公共包含(LCS)?(我想了解两个人的共同概念。这里我提到了owl文件代码) 答案仍然是空的这可能是重复的,但这个问题没有一个公认的答案,而且还询问了路径长度,这使得事情更加复杂。通常,您可以通过以下方式找到类?子类1和?子类2的常见超类: ?subclass1 rdfs:subClassOf* ?superclass . ?subclass2 rdfs:subClassOf* ?superclass . 您可以通过以下方式使其变短: ?superc

如何使用SPARQL查询获取本体中个体的最小公共包含(LCS)?(我想了解两个人的共同概念。这里我提到了owl文件代码)


答案仍然是空的

这可能是重复的,但这个问题没有一个公认的答案,而且还询问了路径长度,这使得事情更加复杂。通常,您可以通过以下方式找到类
?子类1
?子类2
的常见超类:

?subclass1 rdfs:subClassOf* ?superclass .
?subclass2 rdfs:subClassOf* ?superclass .
您可以通过以下方式使其变短:

?superclass ^rdfs:subClassOf* ?subclass1, ?subclass2 .
这将找到这两个子类的所有公共超类。可能没有一个最具体的通用超类,但您可以通过只要求那些不是任何其他超类子类的超类来找到那些尽可能具体的超类:

?superclass ^rdfs:subClassOf* ?subclass1, ?subclass2 .
filter not exists { 
  ?moreSpecificSuperclass rdfs:subClassOf ?superclass ;
                          ^rdfs:subClassOf* ?subclass1, ?subclass2 .
}
要查找某些特定实例的LCS,您需要执行以下操作:

?instance1 rdf:type/rdfs:subClassOf* ?lcs .
?instance2 rdf:type/rdfs:subClassOf* ?lcs .
filter not exists {
  ?instance1 rdf:type/rdfs:subClassOf* ?sublcs .
  ?instance2 rdf:type/rdfs:subClassOf* ?sublcs .
  ?sublcs rdfs:subClassOf ?lcs .
}
如前所述,您可以将该位缩短为:

?lcs ^(rdf:type/rdfs:subClassOf*) ?instance1, ?instance2 .
filter not exists {
  ?sublcs ^(rdf:type/rdfs:subClassOf*) ?instance1, ?instance2 ;
          rdfs:subClassOf ?lcs . 
}
第一行确保?type是?x和?y的公共类型,而过滤器表达式确保?type没有子类也是?x和?y的公共类型

下面是一个简单的例子,说明这种方法是有效的。下面是一个具有类层次结构的本体:

猫头鹰:东西 A. B C{C} D{D}

个体c和d分别是类别c和d的元素。LCS为B。以下是查询及其结果:

前缀:
前缀owl:
前缀rdf:
前缀rdfs:
选择?lcs何处{
lcs^(rdf:类型/rdfs:子类*):c,:d;
猫头鹰:上课。
筛选器不存在{
有限责任公司^(rdf:类型/rdf:子类*):c,:d;
猫头鹰:类;
rdfs:子类+?lcs。
}
}

重要的是,您可以创建一个最小的示例。从头开始,创建一个本体,它只包含足够的信息来测试您的查询。然后,编辑你的问题并添加本体。我看到了你的本体。我通过java代码查询它。我得到的答案是空白的。甚至我也通过protege的sparql引擎进行了测试。我也得到了空白答案。在我的论文中,我使用的是ApacheJena。1)我免费帮助解决堆栈溢出问题,因为这对每个人都有好处。如果您没有在问题中发布代码和数据,那么除了您之外,其他人都不会受益。如果您坚持非堆栈溢出的通信,可能会讨论咨询费用。2) 我确实查看了您发送给我的dropbox链接,您query.text中的查询与我上次更新答案时的查询不同。当我使用适当的
前缀和
:西维因
:Ethion
而不是
:c
:d
对您的数据运行查询时,我得到的结果是
:BollwormPests\u杀虫剂
。我根据您的查询进行了更改,选择了lcs where{?lcs^rdf:type:西维因,:Ethion;owl:Class.筛选器不存在{?llcs^rdf:type:西维因,:Ethion;owl:Class;rdfs:subassof+?lcs.}在answerJena的命令行
sparql
工具中仍然是空白,包括在发行版中。例如,
sparql--query query query.text--data ontology.owl
。这是运行查询的最快方法,并且它使用了我们可以访问的同一个Jena API。使用命令行工具调试您的查询。如果您在在您的代码中,您可以问这样的问题:“此查询在命令行上工作并生成这些结果,但运行同一查询的代码不会。”这是创建的一部分。
?superclass ^rdfs:subClassOf* ?subclass1, ?subclass2 .
filter not exists { 
  ?moreSpecificSuperclass rdfs:subClassOf ?superclass ;
                          ^rdfs:subClassOf* ?subclass1, ?subclass2 .
}
?instance1 rdf:type/rdfs:subClassOf* ?lcs .
?instance2 rdf:type/rdfs:subClassOf* ?lcs .
filter not exists {
  ?instance1 rdf:type/rdfs:subClassOf* ?sublcs .
  ?instance2 rdf:type/rdfs:subClassOf* ?sublcs .
  ?sublcs rdfs:subClassOf ?lcs .
}
?lcs ^(rdf:type/rdfs:subClassOf*) ?instance1, ?instance2 .
filter not exists {
  ?sublcs ^(rdf:type/rdfs:subClassOf*) ?instance1, ?instance2 ;
          rdfs:subClassOf ?lcs . 
}
-------
| lcs |
=======
| :B  |
-------