Schema.org цены и SPARQL - PullRequest
       24

Schema.org цены и SPARQL

2 голосов
/ 01 декабря 2011

У меня есть следующий HTML-код с Schema.org RDFa:

<li class="product" typeof="s:Product">
  <a href="item.php?id=227">
     <img property="s:img" src="http://www.test.com/pictures/227.jpg"></a>
  <h2 property="s:name">Example name</h2>
  <div property="s:brand">Examplebrand</div>
  <div property="s:model">Examplemodel</div>
  <div rel="s:offers">
    <div class="description" typeof="s:Offer">
      <div property="s:price">79,00</div>
      <div property="s:priceCurrency" content="EUR"></div>
    </div>
  </div>
  <div property="s:productID" content="NQ==">
    <div rel="s:seller">
      <div class="description" typeof="s:Organization">
        <div property="s:name">Shop1</div>
      </div>
    </div>
  </div>
</li>

После загрузки страницы я хочу использовать SPARQL, чтобы выбрать все продукты, которые (например)> € 70,00.

Но это только возвращает NULL:

PREFIX s: <http://schema.org/>
SELECT   ?a ?price
WHERE {
  ?a s:price ?price.
  FILTER (?price > 70).
}

Я думаю, что это не интерпретирует цену как цену / плавающее.Что я делаю неправильно?

1 Ответ

0 голосов
/ 07 августа 2013

XHTML недостаточно для получения соответствующих данных RDF из RDFa. Я заполнил ваш XHTML в следующем. Обратите внимание, что я сделал префикс s равным http://schema.org/ на основе вашего запроса SPARQL. Однако, если эти префиксы не совпадают в ваших данных, это было бы легким местом для разрушения.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.1//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-2.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" 
      version="XHTML+RDFa 1.1"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:s="http://schema.org/"
      xsi:schemaLocation="http://www.w3.org/1999/xhtml
                          http://www.w3.org/MarkUp/SCHEMA/xhtml-rdfa-2.xsd"
      lang="en"
      xml:lang="en">
  <head><title>Some title</title></head>
  <body>
    <li class="product" typeof="s:Product">
      <a href="item.php?id=227">
        <img property="s:img" src="http://www.test.com/pictures/227.jpg"/></a>
      <h2 property="s:name">Example name</h2>
      <div property="s:brand">Examplebrand</div>
      <div property="s:model">Examplemodel</div>
      <div rel="s:offers">
        <div class="description" typeof="s:Offer">
          <div property="s:price">79,00</div>
          <div property="s:priceCurrency" content="EUR"></div>
        </div>
      </div>
      <div property="s:productID" content="NQ==">
        <div rel="s:seller">
          <div class="description" typeof="s:Organization">
            <div property="s:name">Shop1</div>
          </div>
        </div>
      </div>
    </li>
  </body>
</html>

Поместив это в дистиллятор RDFa W3C , мы можем получить этот RDF:

<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
  xmlns:s="http://schema.org/"
  xmlns:xhv="http://www.w3.org/1999/xhtml/vocab#"
  xmlns:xml="http://www.w3.org/XML/1998/namespace"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
  <rdf:Description rdf:about="http://www.test.com/pictures/227.jpg">
    <s:img xml:lang="en"></s:img>
  </rdf:Description>
  <s:Product>
    <s:seller>
      <s:Organization>
        <s:name xml:lang="en">Shop1</s:name>
      </s:Organization>
    </s:seller>
    <s:productID xml:lang="en">NQ==</s:productID>
    <s:model xml:lang="en">Examplemodel</s:model>
    <s:offers>
      <s:Offer>
        <s:priceCurrency xml:lang="en">EUR</s:priceCurrency>
        <s:price xml:lang="en">79,00</s:price>
      </s:Offer>
    </s:offers>
    <s:name xml:lang="en">Example name</s:name>
    <s:brand xml:lang="en">Examplebrand</s:brand>
  </s:Product>
</rdf:RDF>

Глядя на RDF, легко понять, почему цена интерпретируется как строка:

<s:price xml:lang="en">79,00</s:price>

Значением свойства является строка и строка с языковым тегом! Однако вы можете легко указать тип данных, добавив пространство имен и атрибут datatype:

<html xmlns="http://www.w3.org/1999/xhtml" 
      version="XHTML+RDFa 1.1"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      ...>
  ...
  <div property="s:price" datatype="xsd:float">79,00</div>
  ...
</html>

Тем не менее, запись типа запятая на самом деле недопустима для типа xsd:float, поэтому вам также необходимо указать атрибут content, например:

<div property="s:price" datatype="xsd:float" content="79.00">79,00</div>

После этих изменений вы получите RDF:

<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
  xmlns:s="http://schema.org/"
  xmlns:xhv="http://www.w3.org/1999/xhtml/vocab#"
  xmlns:xml="http://www.w3.org/XML/1998/namespace"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
  <s:Product>
    <s:productID xml:lang="en">NQ==</s:productID>
    <s:model xml:lang="en">Examplemodel</s:model>
    <s:brand xml:lang="en">Examplebrand</s:brand>
    <s:offers>
      <s:Offer>
        <s:priceCurrency xml:lang="en">EUR</s:priceCurrency>
        <s:price rdf:datatype="http://www.w3.org/2001/XMLSchema#float">79.00</s:price>
      </s:Offer>
    </s:offers>
    <s:name xml:lang="en">Example name</s:name>
    <s:seller>
      <s:Organization>
        <s:name xml:lang="en">Shop1</s:name>
      </s:Organization>
    </s:seller>
  </s:Product>
  <rdf:Description rdf:about="http://www.test.com/pictures/227.jpg">
    <s:img xml:lang="en"></s:img>
  </rdf:Description>
</rdf:RDF>

После этих изменений ваш запрос работает нормально, без изменений:

$ arq --data data3.rdf --query query.sparql 
------------------------------------------------------------
| a    | price                                             |
============================================================
| _:b0 | "79.00"^^<http://www.w3.org/2001/XMLSchema#float> |
------------------------------------------------------------
...