Как запросить циклические отношения в графе RDF? - PullRequest
0 голосов
/ 09 января 2020

У меня есть следующий примерный график сервисов, который включает информацию о зависимостях:

@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?

спасибо!

1 Ответ

0 голосов
/ 10 января 2020

Это всегда одношаговые циклы?

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 ;
       c:serviceDependency ?a 
  }
...