使用SPARQL构造查询部分RDF图

时间:2017-02-06 20:24:24

标签: java sparql rdf sesame rdf4j

我正在使用RDF4J本机三元组,其中存储了几个命名的图形/模型。在我的Java程序中,我试图通过使用SPARQL CONSTRUCT查询表单从命名图中检索部分图。部分图应该由特定的整数值标识。

我存储的一个命名图形如下所示:

@prefix nif: <http://persistence.uni-leipzig.org/nlp2rdf/ontologies/nif-core#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix app: <http://example.org/> .
@prefix onto: <http://example.org/ontology/> .

app:context#char=0,54 a nif:Context , nif:RFC5147String , nif:String ;
    nif:beginIndex "0"^^xsd:int ;
    nif:endIndex "54"^^xsd:int ;
    nif:isString "Barack Obama lives in Washington. He studied at Harvard" .

app:sentence#char=0,31 a nif:RFC5147String , nif:String , nif:Sentence ;
    onto:index "0"^^xsd:int ;
    nif:beginIndex "0"^^xsd:int ;
    nif:endIndex "31"^^xsd:int ;
    onto:entity app:entity#char=0,12 , app:entity#char=22,30 ;
    nif:referenceContext app:context#char=0,54 ;
    nif:nextSentence app:sentence#char=32,54 ;
    nif:anchorOf "Barack Obama lives in Washington." .

app:sentence#char=32,54 a nif:RFC5147String , nif:String , nif:Sentence ;
    onto:index "1"^^xsd:int ;
    nif:beginIndex "32"^^xsd:int ;
    nif:endIndex "54"^^xsd:int ;
    onto:entity app:entity#char=46,53 ;
    nif:referenceContext app:context#char=0,54 ;
    nif:previousSentence app:sentence#char=0,31 ;
    nif:anchorOf "He studied at Harvard." .

app:entity#char=0,12 a nif:RFC5147String , nif:String , nif:Phrase ;
    nif:beginIndex "0"^^xsd:int ;
    nif:endIndex "12"^^xsd:int ;
    onto:type "PERSON" ;
    nif:referenceContext app:context#char=0,54 ;
    nif:sentence app:sentence#char=0,31 ;
    nif:anchorOf "Barack Obama" .       

app:entity#char=22,30 a nif:RFC5147String , nif:String , nif:Phrase ;
    nif:beginIndex "22"^^xsd:int ;
    nif:endIndex "30"^^xsd:int ;
    onto:type "LOCATION" ;
    nif:referenceContext app:context#char=0,54 ;
    nif:sentence app:sentence#char=0,31 ;
    nif:anchorOf "Washington" .

app:entity#char=46,53 a nif:RFC5147String , nif:String , nif:Phrase ;
    nif:beginIndex "46"^^xsd:int ;
    nif:endIndex "53"^^xsd:int ;
    onto:type "ORGANIZATION" ;
    nif:referenceContext app:context#char=0,54 ;
    nif:sentence app:sentence#char=32,54 ;
    nif:anchorOf "Harvard" .

上图描述了两个用NLP工具注释的句子。我想查询代表这些句子之一的子图,包括上下文,句子本身和该特定句子的所有实体。

每个句子都有一个带有谓词{{​​1}}的索引,我想用它来识别特定的句子。属于句子的实体由onto:index标识。

因此,所需的子图应包含主题onto:entityapp:context#char=0,54app:sentence#char=0,31app:entity#char=0,12及其各自的谓词和对象。因此,应包含主题app:entity#char=22,30app:sentence#char=32,54

到目前为止,我的SPARQL查询如下所示:

app:entity#char=46,53

在Java中它看起来像这样:

PREFIX nif: <http://persistence.uni-leipzig.org/nlp2rdf/ontologies/nif-core#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX app: <http://example.org/location#>
PREFIX onto: <http://example.org/ontology/>

CONSTRUCT {
    ?s ?p ?o .
}

WHERE {
    GRAPH app:12345 {
        ?s onto:index sentenceIndex .
    }
}

String nif: "http://persistence.uni-leipzig.org/nlp2rdf/ontologies/nif-core#"; String xsd: "http://www.w3.org/2001/XMLSchema#"; String app = "http://example.org/location#" + modelID; String onto = "http://example.org/ontology/"; String sparqlQuery = "PREFIX nif: <" + nif + "> \n"; sparqlQuery += "PREFIX xsd: <" + xsd + "> \n"; sparqlQuery += "PREFIX onto: <" + onto + "> \n"; sparqlQuery += "CONSTRUCT { \n"; sparqlQuery += " ?s ?p ?o . \n"; sparqlQuery += "} \n"; sparqlQuery += "WHERE { \n"; sparqlQuery += " GRAPH <" + app + "> { \n"; sparqlQuery += " ?s onto:index " + sentenceIndex + " . \n"; sparqlQuery += " } \n"; sparqlQuery += "}"; 表达式是一个Java int变量,它提供实际的sentenceIndex值。 onto:index是优越的命名图。

出于测试目的,上述查询最初应该只返回给定索引的整个句子主题而没有上下文或实体。但即使这个简单的任务也失败了它只返回一个空的RDF4J模型。

现在,为了获得app:location#12345谓词所标识的所需子图,正确的SPARQL查询是什么?

我不熟悉SPARQL,所以非常感谢任何帮助。提前谢谢!

2 个答案:

答案 0 :(得分:3)

  1. 前缀由SPARQL中的点分隔,即查询不应在RDF4J中编译

  2. 为什么要将带前缀的图形URI放入尖括号?要么使用

    1. 完整的URI <http://example.org/location#12345>
    2. 您更改app的名称空间声明并使用前缀URI app:12345
  3. PREFIX  app:  <http://example.org/location#>
    PREFIX  xsd:  <http://www.w3.org/2001/XMLSchema#>
    PREFIX  nif:  <http://persistence.unileipzig.org/nlp2rdf/ontologies/nif-core#>
    PREFIX  onto: <http://example.org/ontology/>
    
    CONSTRUCT 
      { 
        ?s ?p ?o .
      }
    WHERE
      { GRAPH app:12345
          { ?s  onto:index  sentenceIndex }
      }
    

答案 1 :(得分:1)

为了使任务更容易,我建议你现在根本不使用前缀。首先尝试查看以下构造查询是否有效:

CONSTRUCT {
    ?s ?p ?o .
}

WHERE {
    GRAPH <http://example.org/location#12345> {
        ?s <http://example.org/ontology/index> 0 .
    }
}

如果这不起作用,请使用以下查询检查数据是否真的,确实是100%在图表“http://example.org/location#12345”中:

SELECT * 
WHERE {
  ?s ?p ?o 

  optional{
  GRAPH ?g {
    ?s ?p ?o
  }
 }
}

此查询显示您的所有数据以及数据所在的图表。通过使用此查询,您还可以检查您查询的谓词(索引)是否正确。

希望这可以帮助您找到问题,并且开心SPARQL!