1

我正在使用一个 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 工具注释的句子。我想查询一个代表这些句子之一的子图,包括上下文、句子本身以及该特定句子的所有实体。

每个句子都有一个带有 predicate 的索引onto:index,我想用它来识别一个特定的句子。属于句子的实体由 标识onto:entity

因此,所需的子图应该由主语app:context#char=0,54app:sentence#char=0,31app:entity#char=0,12以及app:entity#char=22,30它们各自的谓词和宾语组成。因此,它不应包含主题app:sentence#char=32,54app:entity#char=46,53

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

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

在 Java 中,它看起来像这样:

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 += "}";

sentenceIndex表达式是一个传递实际onto:index值的 Java int 变量。app:location#12345是上级命名图。

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

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

我不熟悉 SPARQL,因此非常感谢任何帮助。提前致谢!

4

2 回答 2

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

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

    1. 完整的 URI<http://example.org/location#12345>
    2. 您更改命名空间声明app并使用前缀 URIapp:12345
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 }
  }
于 2017-02-07T01:42:49.060 回答
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
  }
 }
}

此查询向您显示所有数据,以及数据位于哪个图表上。通过使用此查询,您还可以检查您查询的谓词 (index) 是否正确。

希望这可以帮助您找到问题,并祝 SPARQLing 快乐!

于 2017-02-10T07:44:06.167 回答