SPARQL绑定谓词/子属性不是变量

时间:2015-07-25 04:49:15

标签: rdf sparql jena fuseki

我想在sparql中绑定属性而不是任何变量。 根据{{​​3}} 我可以绑定任何变量,如BIND ( 42 AS ?price ) 我的问题是我们可以定义类似这样的东西

BIND ( ?product rdf:price 42 ) 要么 BIND ( ?product rdf:price ?price )

OR对我来说理想的情况是 BIND ( ?product ?property ?price ) // where ?property can be minPrice, maxPrice or avgPrice

我的用例是获取此类信息。

SELECT * WHERE {
   ?product :title ?title; :brand ?brand; :id ?productID.
   ?product :totalOffers =(assign) {
        select COUNT(?oid) WHERE {?oid :isOfferOf ?productID}
   } 
  // or like this 
  ?product (:totalOffers :minPrice :maxPrice ) =(assign) {
        select COUNT(?oid) MIN(?price) MAX(?price) WHERE {?oid :isOfferOf ?productID. ?oid :price ?price }
   }
}

谢谢

1 个答案:

答案 0 :(得分:1)

首先要了解的是SPARQL执行是自下而上的,因此将首先评估子查询。因此,如果要分配一些值以供在子查询中使用,则需要在子查询中执行此操作。

要分配多个变量,您可以使用多个BIND语句,例如

BIND("foo" AS ?a)
BIND("bar" AS ?b)
# etc

或者您可以使用单个VALUES语句,例如

VALUES ( ?a ?b ) { ( "foo" "bar" ) }

所以你只需要在查询中使用它,例如

SELECT * WHERE
{
  {
    SELECT 
      ?product 
      (COUNT(?oid) AS ?offers) 
      (MIN(?price) AS ?minPrice) 
      (MAX(?price) AS ?maxPrice)
    WHERE
    {
      VALUES ( ?product ) 
      { 
        ( <http://example.org/product> ) 
      }
      ?product :id ?productID .
      ?oid :isOfferOf ?productID .
      ?oid :price ?price .
    }
    GROUP BY ?product
  }
  ?product :title ?title ;
           :brand ?brand .
}