SPARQL(OpenRDF 2.8.0)中不存在关于联合和筛选器的信息

SPARQL(OpenRDF 2.8.0)中不存在关于联合和筛选器的信息,sparql,sesame,Sparql,Sesame,几年前,我学习了一些语义技术,包括RDF和SPARQL,但有一段时间我没有机会使用它们。现在我开始了一个新项目,它使用OpenRDF2.8.0作为语义存储,我正在恢复我的知识,尽管我有一些忘记的东西要恢复 特别是,在过去的几天里,我在正确理解SPARQL中的FILTER NOT EXIST构造时遇到了一些麻烦 问题:我有一个从DbTune.org音乐本体导入的语义存储。mo:MusicArtist,作为mo:Track的foaf:maker,可以出现在四种场景中,我只列出相关的语句: &

几年前,我学习了一些语义技术,包括RDF和SPARQL,但有一段时间我没有机会使用它们。现在我开始了一个新项目,它使用OpenRDF2.8.0作为语义存储,我正在恢复我的知识,尽管我有一些忘记的东西要恢复

特别是,在过去的几天里,我在正确理解SPARQL中的FILTER NOT EXIST构造时遇到了一些麻烦

问题:我有一个从DbTune.org音乐本体导入的语义存储。mo:MusicArtist,作为mo:Track的foaf:maker,可以出现在四种场景中,我只列出相关的语句:

    <http://dbtune.org/musicbrainz/resource/artist/013c8e5b-d72a-4cd3-8dee-6c64d6125823> a mo:MusicArtist ;
        vocab:artist_type "1"^^xs:short ;
        rdfs:label "Edvard Grieg" .

    <http://dbtune.org/musicbrainz/resource/artist/032df978-9130-490e-8857-0c9ef231fae8> a mo:MusicArtist ;
        vocab:artist_type "2"^^xs:short ;
        rel:collaboratesWith <http://dbtune.org/musicbrainz/resource/artist/3db5dfb1-1b91-4038-8268-ae04d15b6a3e> , <http://dbtune.org/musicbrainz/resource/artist/d78afc01-f918-440c-89fc-9d546a3ba4ac> ;
        rdfs:label "Doris Day & Howard Keel".

    <http://dbtune.org/musicbrainz/resource/artist/1645f335-2367-427d-8e2d-ad206946a8eb> a mo:MusicArtist ;
        vocab:artist_type "2"^^xs:short ;
        rdfs:label "Pat Metheny & Anna Maria Jopek".

    <http://dbtune.org/musicbrainz/resource/artist/12822d4f-4607-4f1d-ab16-d6bacc27cafe> a mo:MusicArtist ;
        rdfs:label "René Marie".
这是有意义的,而且它看起来是可读的,可以检索所有mo:MusicArtist项目,减去那些与列出的单个成员协作的项目

我没有立即找到解决办法。我首先想到的是将三个独立的案例结合在一起:

我发现第三个联合声明,那些应该添加mo:MusicArtist项而没有vocab:artist_类型的声明,没有起作用。也就是说,他们没有找到像Rene Marie这样的物品

虽然我对用负号找到的最短解很满意,但我不明白为什么旧的解不起作用,这一事实让我很不满意。很明显,我遗漏了一些过滤器不存在的地方,这可能对其他情况有用


欢迎提供任何帮助。

当我运行以下查询时,我得到的结果听起来像是您在寻找的结果:

选择distinct?标签的位置{ ?艺术家a mo:音乐家; 标签?标签。 -第一类艺术家 { 歌手B:Artister_type 1^^xs:short } -无类型艺术家 联合{ 筛选器不存在{ ?艺人歌手B:艺人类型?类型 } } -类型2的艺术家没有 -合作者 联合{ 歌手B:Artister_type 2^^xs:short 筛选器不存在{ 艺术家:与另一位艺术家合作 } } } 不过,我不知道这和你的有什么本质上的不同。不过,我确实认为你可以稍微澄清一下这个问题。您可以使用optional和值来指定类型是可选的,但如果存在,则必须为1或2。然后,您可以添加一个筛选器,该筛选器要求当值为2时,不存在协作者

选择?标签在哪里{ -找一个艺术家和他们的标签 ?艺术家a mo:音乐家; 标签?标签。 -以及它们的类型(如果是) -1^^xs:short或2^^xs:short 可选的{ 值?类型{1^^xs:short 2^^xs:short} ?艺人歌手B:艺人类型?类型 } -如果?type是2^^xs:short,那么?artist -不得与任何人合作。 filter!sameTerm?类型,2^^xs:short ||不存在{艺术家关系:与任何人合作} }
你的一条评论说,没有定义与单人协作的组-是否应该检查协作者的值?any1实际上是一个人,即不是一个组?Joshua,好问题。在与我的音乐收藏相关的数据中,我没有看到与组相关的组,但我当然没有浏览整个存储库。我想没关系。这个想法是,如果有一个rel:collaborationWith it可以是任何东西,最终是一个协作链,那么最终会有一个与任何东西都无关的项目。谢谢你的提示,我正在研究它。顺便说一下:我还没有考虑性能问题。我认为产生相同结果的不同查询可以以不同的方式执行。几年前,我意识到有些事情需要避免,但经过这么长时间,我认为事情本来可以改变的。是否存在已知的速度较慢的构造?当然,我指的是OpenRDF实现。@FabrizioGiudici我认为SPARQL的查询优化状态没有一些关系数据库那么先进,而且系统之间也有一些差异。就我个人而言,在你知道某件事是否是瓶颈之前,我不会太担心性能。@Josuha。这是有道理的。谢谢
    SELECT *
    WHERE  
      { 
        ?artist     a           mo:MusicArtist. 
        ?artist     rdfs:label  ?label. 

        MINUS 
          {
            ?artist     vocab:artist_type       "2"^^xs:short.
            ?artist     rel:collaboratesWith    ?any1 .
          }
      } 
    ORDER BY ?label
    SELECT *
    WHERE  
      { 
        ?artist       a                 mo:MusicArtist. 
        ?artist       rdfs:label        ?label. 
    # Single artists
          {
            ?artist     vocab:artist_type       "1"^^xs:short.
          }
        UNION
    # Groups for which there is no defined collaboration with single persons
          {
            ?artist     vocab:artist_type       "2"^^xs:short.
            FILTER NOT EXISTS 
              {
                ?artist     rel:collaboratesWith    ?any1 
              }
          }
        UNION
    # Some artists don't have this attribute
          {
            FILTER NOT EXISTS 
              {
                ?artist     vocab:artist_type       ?any2
              }
          }
      } 
    ORDER BY ?label
------------------------------------
| label                            |
====================================
| "René Marie"                     |
| "Pat Metheny & Anna Maria Jopek" |
| "Edvard Grieg"                   |
------------------------------------
------------------------------------
| label                            |
====================================
| "René Marie"                     |
| "Pat Metheny & Anna Maria Jopek" |
| "Edvard Grieg"                   |
------------------------------------