Как сопоставить относительный IRI субъекта в тройке RDF на языке запросов SPARQL?
Я пытаюсь использовать SPARQL
чтобы соответствовать IRI, относящемуся к базе. Вот пример фрагмента кода rdf-xml:
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF xmlns:bqbiol="http://biomodels.net/biology-qualifiers/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xml:base="base-uri.rdf">
<rdf:Description rdf:about="metaid_1">
<bqbiol:is rdf:resource="https://identifiers.org/uniprot/P0DP23"/>
</rdf:Description>
</rdf:RDF>
Я хочу сопоставить эту тройку по теме rdf:about="metaid_1"
. Если я запустил следующий запрос sparql:
// query 1
SELECT ?x ?y ?z
WHERE {
?x ?y ?z
}
Результат:
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rs: <http://www.w3.org/2001/sw/DataAccess/tests/result-set#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
[] rdf:type rs:ResultSet ;
rs:resultVariable "x" ;
rs:resultVariable "y" ;
rs:resultVariable "z" ;
rs:solution [ rs:binding [ rs:variable "x" ;
rs:value <metaid_1>
] ;
rs:binding [ rs:variable "y" ;
rs:value <http://biomodels.net/biology-qualifiers/is>
] ;
rs:binding [ rs:variable "z" ;
rs:value <https://identifiers.org/uniprot/P0DP23>
]
] .
Но когда я запускаю любое из следующих действий, я получаю пустой результат:
// query 2
SELECT ?y ?z
WHERE {
<metaid_1> ?y ?z
}
// query 3
SELECT ?y ?z
WHERE {
<base-uri.rdf#metaid_1> ?y ?z
}
// query 4
SELECT ?y ?z
WHERE {
<base-uri.rdf/metaid_1> ?y ?z
}
Может ли кто-нибудь предложить альтернативный запрос для сопоставления троек на основе относительного metaid_1
ири?
edit - ответ на комментарии
Я забыл упомянуть, что пытался использовать BASE
вот так:
// query 5
SELECT ?y ?z
WHERE {
<BASE/metaid_1> ?y ?z
}
и несколько вариантов, но не было предложено в комментарии, который был:
// query 6
BASE <base-uri.rdf>
SELECT ?y ?z
WHERE {
<metaid_1> ?y ?z
}
Что также возвращает пустой набор результатов.
изменить 2 - ответ на дополнительные комментарии
@uninformedUser прав в том, что я собирался использовать локальные iri, потому что эти предметы по существу являются атрибутами метаданных в элементах xml для локальных строк xml. Я полагаю, когда пакет, который я пишу, используется в Интернете, они станутhttps://
, но пока это просто строки, созданные для тестирования.
Я попытался изменить xml:base
к file:///mnt/d/libsemsim/tests/base-uri.rdf
Итак, теперь фрагмент xml гласит:
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF xmlns:bqbiol="http://biomodels.net/biology-qualifiers/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xml:base="file:///mnt/d/libsemsim/tests/base-uri.rdf">
<rdf:Description rdf:about="metaid_1">
<bqbiol:is rdf:resource="https://identifiers.org/uniprot/P0DP23"/>
</rdf:Description>
</rdf:RDF>
И запрос:
BASE <file:///mnt/d/libsemsim/tests/base-uri.rdf>
SELECT ?y ?z
WHERE {
<metaid_1> ?y ?z
}
Но все же мой набор результатов пуст. Мне интересно, не в том ли проблема, что я запрашиваюrdf
model
сам, который является центральным объектом в пакете librdf и не обязательно является сериализованным представлением xml, как я показал здесь.