使用Jena,Sparql和初始DBPedia URI进行简单的深度搜索

时间:2014-10-11 23:13:33

标签: java sparql jena endpoint dbpedia

根据DBPedia的初始URI(例如:dbpedia.org/resource/Barack_Obama),我需要按照以下步骤执行深度搜索:

1 - 从DBPedia取消引用RDF链接 [确定]

2 - 取出所有断言此模式的三元组 [确定]

<givenURI> <property> <someObject> .

3 - 将结果插回初始图 [?]

4 - 要浏览新数据,我需要找到满足这两种模式的新三元组 [?]

 <URI> owl:sameAs <resourceObject> . 
 <subjectResource> owl:sameAs <URI> .

5 - 比回到第一步,递归地执行,保存访问过的URI以避免infity循环。

因此,第2步中有resultSet。此时,它是来自初始URI(dbpedia.org/resource/Barack_Obama)的所有属性/对象。

select ?property ?resource where {
  <http://dbpedia.org/resource/Barack_Obama> ?property ?resource
}
property,resource
http://www.w3.org/1999/02/22-rdf-syntax-ns#type,http://xmlns.com/foaf/0.1/Person
http://www.w3.org/1999/02/22-rdf-syntax-ns#type,http://schema.org/Person
http://www.w3.org/1999/02/22-rdf-syntax-ns#type,http://dbpedia.org/class/yago/UnitedStatesSenatorsFromIllinois
http://www.w3.org/1999/02/22-rdf-syntax-ns#type,http://wikidata.dbpedia.org/resource/Q215627
http://www.w3.org/1999/02/22-rdf-syntax-ns#type,http://www.w3.org/2002/07/owl#Thing
http://www.w3.org/1999/02/22-rdf-syntax-ns#type,http://wikidata.dbpedia.org/resource/Q5
...

我真的很困惑如何将此查询中的resultSet插入到初始图形中,而不是再次深入搜索它。

使用Jena和Sparql在Java上有实际的代码:

public class SemanticCrawlerImpl implements SemanticCrawler {
    public void search(Model graph, String resourceURI) {
        graph.read(resourceURI);

        ParameterizedSparqlString queryString = new ParameterizedSparqlString( "" +
                "select ?property ?resource where {\n" +
                "  <"+resourceURI+"> ?property ?resource\n" +
                "}" );

        System.out.println( queryString );

        QueryExecution exec = QueryExecutionFactory.sparqlService( "http://dbpedia.org/sparql", queryString.asQuery() );

        com.hp.hpl.jena.query.ResultSet results = ResultSetFactory.copyResults( exec.execSelect() );

        ResultSetFormatter.outputAsCSV( results );
    }
}

所以,就是这样。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

您并不完全清楚自己怀疑自己想要关注的内容,但听起来就像您想要从dbpedia开始:Barack_Obama,拉出所有以此作为主题的三元组,然后对具有属性owl的任何三元组的对象执行相同的操作:sameAs。也就是说,你试图通过一个猫头鹰连接主题来获得所有三元组:sameAs链到dbpedia:Barack_Obama。但是,您不需要多个查询来执行此操作;你可以使用属性路径:

construct { ?s ?p ?o }
where {
  ?s ?p ?o 
  {
    select ?s { 
      ?s (owl:sameAs|^owl:sameAs)? dbpedia:Barack_Obama
    }
  }
}

SPARQL Results

那就是将{db}:Barack_Obama作为?s,以及任何x这样的

x owl:sameAs dbpedia:Barack_Obama

dbpedia:Barack_Obama owl:sameAs x

并返回所有三元组?s ?p ?o。 (理想情况下,您实际上想要使用

select ?s { 
  ?s (owl:sameAs|^owl:sameAs)* dbpedia:Barack_Obama
}
在子查询中

遵循任意长度的路径,但DBpedia会抱怨可能的内存使用情况。)

现在,这是一个构造查询,但编写相应的查询会更新图表?g非常容易:

insert { graph <URIofGraph> { ?s ?p ?o } }
where {
  service <http://dbpedia.org/sparql> {
    ?s ?p ?o 
    {
      select ?s { 
        ?s (owl:sameAs|^owl:sameAs)? dbpedia:Barack_Obama
      }
    }
  }
}