如何以编程方式列出本体中两个实例之间的关系?

时间:2013-04-18 14:26:20

标签: routes jena ontology instances

我有一个本体论,我构成了如下关系

Company1 
  :hasSubsidary sub1 
  :hasDepartment Cars1 
  :hasSubdepartment Manufacturing 
  :isinBuilding  area1 
  :hasUnit PrecisionMaching 
  :hasMachine LatheMachine1

我有一个本体模型,描述了这些个人创建和关系。

如果使用Jena或任何其他API输入参数为Company1Lathemachine1,我可以语法列出所有关系路径吗?

1 个答案:

答案 0 :(得分:0)

你没有说明你的本体是什么命名空间,所以我推测它是http://example.com/ontologies/test#。鉴于此,您有两个基本选择:使用SPARQL,或直接使用Jena RDF API。

在第一种情况下,您的查询非常简单:

prefix ex: <http://example.com/ontologies/test#>
select distinct ?relationship where { ex:Company1 ?relationship ex:LatheMchine1 }

您可以看到如何从Java代码in the Jena documentation运行SPARQL查询。

在第二种情况下,它也非常简单:

Model m = ... your RDF model ... ;
String NS = "http://example.com/ontologies/test#";
Resource company1 = m.getResource( NS + "Company1" );
Resource lathe1 = m.getResource( NS + "LatheMachine1" );

Set<Property> relationships = new HashSet<Property>();
for (StmtIterator i = m.listStatements( company1, null, lathe1 ); i.hasNext();) {
  Statement s = i.next();
  relationships.add( s.getPredicate() );
}
海报在评论中更全面地解释了问题之后

更新

好的,所以你需要的是给定节点之间的路径。如果您只想要 路径,而不是所有路径,则可以使用OntTools.findShortestPath()

Path p = OntTools.findShortestPath( m, company1, lathe1, Filter.any() );

如果您确实需要所有路径,可以使用findShortestPath中的代码作为模板进行简单的广度优先搜索。