【问题标题】:Simple depth search using Jena, Sparql and a initial DBPedia URI使用 Jena、Sparql 和初始 DBPedia URI 的简单深度搜索
【发布时间】:2014-10-11 23:13:33
【问题描述】:

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

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

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

<givenURI> <property> <someObject> .

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

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

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

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

所以,有 第 2 步的结果集。此时,所有的属性/对象都来自初始 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
...

我真的很困惑如何将这个查询中的结果集插入到初始图中,而不是再次对其进行深度搜索..

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

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 );
    }
}

原来如此。任何帮助将不胜感激!

【问题讨论】:

  • 您不插入结果集,而是插入三元组。第一部分类似于insert { graph &lt;graph&gt; { &lt;givenURI&gt; ?p ?o } } where { service &lt;http:/dbpedia.org/sparql&gt; { &lt;givenURI&gt; ?p ?o } }
  • 如果我理解正确的话,这里实际上不需要任何重复。你只想要所有以&lt;givenURI&gt; 为主题的三元组,或者任何与 owl:sameAs 相同的东西,对吧?这并不难(写一个答案......)。

标签: java sparql jena endpoint dbpedia


【解决方案1】:

您并不完全清楚您要遵循什么,但它听起来就像您想从 dbpedia:Barack_Obama 开始,以它为主题拉出所有三元组,然后对具有属性 owl:sameAs 的任何三元组的对象执行相同操作。也就是说,您正在尝试获取所有三元组,其主题通过 owl:sameAs 链连接到 dbpedia:Barack_Obama。不过,您不需要多个查询来做到这一点;你可以只使用属性路径:

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

SPARQL Results

这表示将 URI dbpedia:Barack_Obama 以及任何 x 视为 ?s,以便

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
      }
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多