Я использую собственный трипестор RDF4J, где хранятся несколько названных графиков/моделей. В моей программе Java я пытаюсь получить частичный график из именованного графа, используя форму запроса SPARQL CONSTRUCT. Частичный график следует идентифицировать с помощью определенного целочисленного значения.Запрос частичного графика RDF с использованием конструкции 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/> .
@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, которая обеспечивает реальную onto:index
значение. app:location#12345
- превосходный названный граф.
Для целей тестирования вышеприведенный запрос должен изначально просто вернуть объект предложения по данному индексу без контекста или сущностей. Но даже эта простая задача не удалась. Он просто возвращает пустую модель RDF4J.
Теперь, каков правильный запрос SPARQL, чтобы получить желаемый подграф, идентифицированный предикатом onto:index
?
Я не знаком с SPARQL, поэтому любая помощь очень ценится. Заранее спасибо!
Этот запрос является синтаксически неправильным и не возвращает пустую модель - вместо этого запрос будет терпеть неудачу с синтаксической ошибкой (вызванной полными остановками за объявлениями префикса). Вероятно, это просто ошибка с копированием и вставкой с вашей стороны и легко исправлена, но для дальнейшего использования, пожалуйста, имейте в виду, чтобы проверить точный код, который вы публикуете на SO. –
Прошу прощения, это действительно была ошибка копирования и вставки. Я отредактировал свой пост и добавил фактический код Java, дополнительно. Этот код не имеет ошибки компиляции, но возвращает пустую модель. – phly