Rdf 非分层分面Sparql查询

Rdf 非分层分面Sparql查询,rdf,sparql,Rdf,Sparql,在SPARQL中进行facets查询的最佳方法是什么 我想根据以前选择的方面动态生成此查询。 获取给定谓词列表的N个最具代表性的值 目前,我对每个方面都使用一个查询,这显然不是大型数据集的最佳方式 以下是一个例子: #Facets corresponding to dc:title SELECT ?o (count(?s) as ?count ) (str(<dc:title>) as ?uri) WHERE{ # Here come the

在SPARQL中进行facets查询的最佳方法是什么

我想根据以前选择的方面动态生成此查询。 获取给定谓词列表的N个最具代表性的值

目前,我对每个方面都使用一个查询,这显然不是大型数据集的最佳方式

以下是一个例子:

#Facets corresponding to dc:title
SELECT ?o (count(?s) as ?count ) (str(<dc:title>) as ?uri)                  
WHERE{

  # Here come the prefiltering statements from previous facets selection
  # ?s dc:format "Book" .   

  # Retrieve all values for a given facet type 
  ?s dc:title ?o .

} GROUP BY ?o ORDER BY DESC(?count) LIMIT 8
更新:

这里是一个不带预筛选的多方面/谓词组合查询的工作示例

SELECT ?count ?o ?uri WHERE { 
{
   SELECT ?o (count(?s) as ?count ) (str(<dcterms:title>) as ?uri)                  
   WHERE{  

      # Retrieve all values for a given facet type 
      ?s dcterms:title ?o .

   } GROUP BY ?o ORDER BY DESC(?count) LIMIT 8

}
UNION
{
   SELECT ?o (count(?s) as ?count ) (str(<dcterms:format>) as ?uri)                  
   WHERE{  

      # Retrieve all values for a given facet type 
      ?s dcterms:format ?o .

   } GROUP BY ?o ORDER BY DESC(?count) LIMIT 8

}}

此查询速度快且有效,但如果我添加一条语句来反映先前选择的方面,请求时间会异常增加。

据我所知,您试图获取一组属性,并为某些值k查找数据中每个属性的k个最频繁值。我认为这在SPARQL中实际上相当困难,因为您将尝试按属性、值对分组,按给定属性和值的三元组数对每个组中的元素进行排序,然后从每个组中获取前k个结果。我不认为你能在SPARQL中做到这一点。为了近似计算,您必须运行许多查询,或者运行一堆子查询,并像您在示例中所做的那样合并它们的结果

但是,如果您可以放弃对确定k的需要,而改为使用约束限制结果,例如仅显示至少出现k次的属性的值,或仅显示至少占使用该属性的三元组k%的属性的值,则可以获得有用的结果

假设您有这样的数据,其中有两个属性,每个属性都有一些值:

@prefix : <http://stackoverflow.com/q/25056010/1281433/>

[] :p1 "a" ; :p2 "x" .
[] :p1 "a" ; :p2 "y" .
[] :p1 "a" ; :p2 "y" .
[] :p1 "b" ; :p2 "z" .
[] :p1 "b" ; :p2 "z" .
[] :p1 "c" .
对于每个属性,您将获得它所具有的值,按特定值的频率排序。我已经显示了绝对发生率和百分比,因为虽然它们给出相同的顺序,但您可以使用它们以不同的方式过滤结果。例如,您可以将having…添加到查询中以限制结果。例如,您可以限制百分比:

having ( ?percentage > .35 )
或者,您可以限制绝对引用:

having ( ?occurrences > 1 )
当然,您也可以以各种方式组合这些结果,以便在您认为合适的情况下包括或排除结果。例如,您可以只要求出现至少5次的值,或者至少占所用值的30%。这可能很有用,例如,在不太常用的属性中:

having ( ?occurrences > 5 || ?percentage > .3 )

我认为你问了一个好问题,但很难说清楚你到底在问什么我不知道faceted是否是一个标准术语。你是在问{p1,p2,p3,…}中的每个属性,k个最频繁的值是什么?这正是我要问的,这种请求在整个图上很容易实现。但是在分面搜索的情况下,您可能需要请求图的一小部分,在我的示例中,三元组具有Book for dc:format。在我的例子中,由此产生的数据集可能非常大,占整个图形的90%。由于聚合关键字,我必须为每个查询或子查询重新筛选…这些类型的查询在SPARQL中实际上有点困难。你能给出一个查询的例子吗?在这个例子中,这种请求很容易在整个图上执行。你的意思是如果你只看一处房产就容易了吗?如果是这样,我同意。我已经用工作查询更新了我的问题。简单,我的意思是容易理解并且在10秒内执行。这个大约需要0.6秒。我知道执行时间取决于TripleStore,顺便说一句,我正在使用Sesame,但在这种情况下,它对我来说有点不清楚。谢谢更新。我不知道你是否有比工会更好的东西。我不确定你是否能做得更好。问题在于,您真正想要做的是按属性分组,然后在每个组内排序。我不确定你是否能做到。你可能会发现做前M%比做前N%更容易,但看起来还是不太容易。
having ( ?occurrences > 1 )
----------------------------------------------------------
| p   | value | occurrences | percentage                 |
==========================================================
| :p1 | "a"   | 3           | 0.5                        |
| :p1 | "b"   | 2           | 0.333333333333333333333333 |
| :p2 | "y"   | 2           | 0.4                        |
| :p2 | "z"   | 2           | 0.4                        |
----------------------------------------------------------
having ( ?occurrences > 5 || ?percentage > .3 )