У меня есть следующий примерный график сервисов, который включает информацию о зависимостях:
@base <https://meta.acme.com/> .
@prefix : <http://schema.meta.acme.com/> .
@prefix dc: <http://purl.org/dc/terms/> .
</service/c84acffd-944a-43c1-8f06-956a4a6033da>
a :Service ;
dc:title "Service 1" ;
:serviceDependency
</service/70987802-9157-4881-ab0c-049b04b7798d>,
</service/2b47109e-26e3-4d06-b245-98730bdb7d43>.
</service/70987802-9157-4881-ab0c-049b04b7798d>
a :Service ;
dc:title "Service 2" ;
:serviceDependency
</service/c84acffd-944a-43c1-8f06-956a4a6033da>,
</service/f45b998c-b496-4318-be40-46c1aafaf6cd> .
</service/2b47109e-26e3-4d06-b245-98730bdb7d43>
a :Service ;
dc:title "Service 3" ;
:serviceDependency </service/> .
</service/f45b998c-b496-4318-be40-46c1aafaf6cd>
a :Service ;
dc:title "Service 4" ;
:serviceDependency </service/> .
Я пишу запрос SPARQL, чтобы найти циклы в отношениях зависимостей. У меня есть запрос, который дает правильные результаты, но он выдает псевдодубликаты.
Например:
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix c: <http://schema.meta.acme.com/>
prefix dc: <http://purl.org/dc/terms/>
select ?a ?aname ?b ?bname
where
{
{
?a a c:Service ;
dc:title ?aname ;
c:serviceDependency ?b .
?b dc:title ?bname .
} filter ( EXISTS { ?b c:serviceDependency ?a } )
}
дает следующий вывод:
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| a | aname | b | bname |
===========================================================================================================================================================================
| <https://meta.acme.com/service/70987802-9157-4881-ab0c-049b04b7798d> | "Service 2" | <https://meta.acme.com/service/c84acffd-944a-43c1-8f06-956a4a6033da> | "Service 1" |
| <https://meta.acme.com/service/c84acffd-944a-43c1-8f06-956a4a6033da> | "Service 1" | <https://meta.acme.com/service/70987802-9157-4881-ab0c-049b04b7798d> | "Service 2" |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Снова это как и ожидалось - однако информация, которую я хочу отобразить в запросе, - это сам цикл, а не обе стороны цикла.
Я думаю о том, как решить эту проблему, чтобы вычислить идентификатор, сортируя и объединяя 2 идентификатора, затем группируя по этим идентификаторам, но я хотел спросить, есть ли более естественный способ сделать это в SPARQL?
спасибо!