我正在使用一个 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,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
表达式是一个传递实际onto:index
值的 Java int 变量。app:location#12345
是上级命名图。
出于测试目的,上述查询最初应该只返回给定索引的整个句子主题,而不需要上下文或实体。但即使是这个简单的任务也失败了。它只是返回一个空的 RDF4J 模型。
现在,为了获得onto:index
谓词标识的所需子图,正确的 SPARQL 查询是什么?
我不熟悉 SPARQL,因此非常感谢任何帮助。提前致谢!