【发布时间】:2017-02-06 20:24:24
【问题描述】:
我正在使用 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 工具注释的句子。我想查询一个表示其中一个句子的子图,包括上下文、句子本身以及该特定句子的所有实体。
每个句子都有一个带有谓词onto:index 的索引,我想用它来识别一个特定的句子。属于一个句子的实体由onto:entity标识。
因此,所需的子图应包含主题 app:context#char=0,54、app:sentence#char=0,31、app:entity#char=0,12 和 app:entity#char=22,30,以及它们各自的谓词和宾语。因此,它应该不包含主题app:sentence#char=32,54 和app: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 表达式是一个 Java int 变量,用于传递实际的 onto:index 值。 app:location#12345 是上级命名图。
出于测试目的,上述查询最初应该只返回给定索引的整个句子主语,没有上下文或实体。但即使是这个简单的任务也失败了。它只是返回一个空的 RDF4J 模型。
现在,为了获得由onto:index 谓词标识的所需子图,正确的 SPARQL 查询是什么?
我不熟悉 SPARQL,因此非常感谢任何帮助。提前致谢!
【问题讨论】:
-
此查询在语法上不正确,并且不会返回空模型 - 相反,查询将失败并出现语法错误(由前缀声明后面的句号引起)。这可能只是您的复制粘贴错误,并且很容易修复,但为了将来参考,请记住测试您在 SO 上发布的确切代码。
-
很抱歉,这确实是复制和粘贴错误。我还编辑了我的帖子并添加了实际的 Java 代码。此代码没有编译错误,但返回一个空模型。
标签: java sparql rdf sesame rdf4j