SPARQL限制变量每个值的结果

SPARQL限制变量每个值的结果,sparql,Sparql,这是重现问题所需的最低数据 @prefix : <http://example.org/rs#> @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> :artist1 rdf:type :Artist . :artist2 rdf:type :Artist . :artist3 rdf:

这是重现问题所需的最低数据

@prefix : <http://example.org/rs#>
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

:artist1 rdf:type :Artist .
:artist2 rdf:type :Artist .
:artist3 rdf:type :Artist .
:en rdf:type :Language .
:it rdf:type :Language .
:gr rdf:type :Language .

:c1
    rdf:type :CountableClass ;
    :appliedOnClass :Artist ;
    :appliedOnProperty :hasArtist
.

:c2
    rdf:type :CountableClass ;
    :appliedOnClass :Language ;
    :appliedOnProperty :hasLanguage
.

:i1
    rdf:type :RecommendableClass ;
    :hasArtist :artist1 ;
    :hasLanguage :en
.

:i2
    rdf:type :RecommendableClass ;
    :hasArtist :artist1 ;
    :hasLanguage :en
.


:i3
    rdf:type :RecommendableClass;
    :hasArtist :artist1 ;
    :hasLanguage :it
.

:i4
    rdf:type :RecommendableClass;
    :hasArtist :artist2 ;
    :hasLanguage :en
.


:i5
    rdf:type :RecommendableClass;
    :hasArtist :artist2 ;
    :hasLanguage :it
.

:i6
    rdf:type :RecommendableClass;
    :hasArtist :artist3 ;
    :hasLanguage :gr
.


:ania :likes :i1 .
:ania :likes :i3 .
:ania :likes :i4 .
@前缀:
@前缀rdfs:
@前缀rdf:
:artist1 rdf:类型:艺术家。
:artist2 rdf:类型:艺术家。
:artist3 rdf:类型:艺术家。
:en rdf:type:Language。
:it rdf:type:Language。
:gr rdf:type:Language。
:c1
rdf:类型:CountableClass;
:appliedOnClass:艺术家;
:AppliedOn属性:hasArtist
.
:c2
rdf:类型:CountableClass;
:appliedOnClass:语言;
:AppliedOn属性:hasLanguage
.
:i1
rdf:type:RecommendableClass;
:艺术家:艺术家1;
:has语言:en
.
:i2
rdf:type:RecommendableClass;
:艺术家:艺术家1;
:has语言:en
.
:i3
rdf:type:RecommendableClass;
:艺术家:艺术家1;
当前位置语言:it
.
:i4
rdf:type:RecommendableClass;
:艺术家:艺术家2;
:has语言:en
.
:i5
rdf:type:RecommendableClass;
:艺术家:艺术家2;
当前位置语言:it
.
:i6
rdf:type:RecommendableClass;
:艺术家:艺术家3;
:has语言:gr
.
:爱:喜欢。
:爱:喜欢:i3。
:爱:喜欢:i4。
这是我的问题

PREFIX  :     <http://example.org/rs#>
PREFIX  rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX  rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX  rs:   <http://spektrum.ctu.cz/ontologies/radio-spectrum#>

SELECT  ?item ?count ?value
WHERE
  { ?item rdf:type :RecommendableClass
    { SELECT  ?countableProperty ?value (count(*) AS ?count)
      WHERE
        { VALUES ?user { :ania }
          VALUES ?countableConfiguration { :c1 }
          ?user :likes ?x .
          ?countableConfiguration :appliedOnProperty ?countableProperty .
          ?countableConfiguration :appliedOnClass ?countableClass .
          ?x ?countableProperty ?value .
          ?value rdf:type ?countableClass
        }
      GROUP BY ?countableProperty ?value
      ORDER BY DESC(?count)
      LIMIT   3
    }
    FILTER NOT EXISTS {?user :likes ?item}
  }
前缀:
前缀rdfs:
前缀rdf:
前缀rs:
选择?项目?计数?值
哪里
{?项rdf:类型:RecommendableClass
{选择?countableProperty?值(计数(*)作为?计数)
哪里
{VALUES?用户{:ania}
值?可数配置{:c1}
用户:喜欢。
?可数配置:appliedOnProperty?可数属性。
?可数配置:appliedOnClass?可数类。
?x?可数属性?值。
?值rdf:类型?可数类
}
按?可数属性?值分组
按描述排序(?计数)
限制3
}
筛选器不存在{?用户:喜欢?项}
}
结果是:

如您所见,有三个项目具有值
artist1
,另外三个项目具有值
artist2


有没有办法让我将每个人的结果限制为2个?首先是一些最小的数据,有三个艺术家,每个艺术家有一些项目。我总是强调堆栈溢出的最小数据点,因为这对于隔离问题很重要。在本例中,您仍然提供了一个相对较大的查询和我们需要的更多数据。因为我们知道问题在于如何对艺术家进行分组,每个艺术家都与多个项目相关,所以这里需要的所有数据都是一些与多个项目相关的艺术家。这样我们就可以很容易地检索它们,并对它们进行分组

@prefix : <urn:ex:> .

:artist1 :p :a1, :a2, :a3, :a4 .
:artist2 :p :b2, :b2, :b3, :b4, :b5 .
:artist3 :p :c2 .
现在,您可以使用having对位置进行过滤,这样每个艺术家最多可以获得两个:

前缀:
选择“艺术家”项目{
艺术家:p?项目?项目。

过滤器(str(?项目)首先是一些最小数据,有三个艺术家,每个艺术家有一些项目。我总是强调堆栈溢出上的最小数据点,因为这对于隔离问题很重要。在这种情况下,您仍然提供了一个相对较大的查询和我们需要的更多数据。因为我们知道问题在于如何对艺术家进行分组每一个都与许多项目相关,这里需要的所有数据都是一些艺术家,他们与许多项目相关。然后我们可以很容易地检索他们,并对他们进行分组

@prefix : <urn:ex:> .

:artist1 :p :a1, :a2, :a3, :a4 .
:artist2 :p :b2, :b2, :b3, :b4, :b5 .
:artist3 :p :c2 .
现在,您可以使用having对位置进行过滤,这样每个艺术家最多可以获得两个:

前缀:
选择“艺术家”项目{
艺术家:p?项目?项目。

filter(str(?item)@JoshuaTaylor是的,在现实生活中我有那么多艺术家,现在我在想,也许在应用程序层面上也很昂贵(耗时),因为将其存储在一个好的(可扩展的)文件中数据类型,我需要:
Map@JoshuaTaylor是的,在现实生活中,我有这么多艺术家,现在我在想,也许在应用程序级别上也很昂贵(耗时),因为要将其存储在一个好的(可扩展的)数据类型中,我需要:
maif这个答案是正确的(我看不到有任何评论质疑它)它值得更多的关注和投票!如果这个答案是正确的(我看不出有任何评论对它提出异议),它值得更多的关注和投票!
-------------------
| artist   | item |
===================
| :artist1 | :a1  |
| :artist1 | :a2  |
| :artist2 | :b2  |
| :artist2 | :b3  |
| :artist3 | :c2  |
-------------------