2011-08-26 12 views
5

Principalmente estoy usando Ruby para hacer esto, pero mi plan de ataque hasta el momento es de la siguiente manera:¿Cuál es la mejor manera de analizar RDFa, Microdatos, etc., almacenar y mostrar información utilizando un esquema/vocabulario uniforme (por ejemplo, schema.org)

Utilice las gemas rdf, rdf-rdfa, y rdf-microdata o mida para analizar los datos dados cualquier URI. Creo que sería mejor para asignar a un esquema uniforme como schema.org, por ejemplo, adoptar este archivo yaml que intenta describir la conversión entre datos vocabulario y OpenGraph a Schema.org:

# Schema X to schema.org conversion 
#data-vocabulary 
DV: 
    name:name 
    street-address:streetAddress 
    region:addressRegion 
    locality:addressLocality 
    photo:image 
    country-name:addressCountry 
    postal-code:postalCode 
    tel:telephone 
    latitude:latitude 
     longitude:longitude 
    type:type 
#opengraph 
OG: 
    title:name 
    type:type 
    image:image 
    site_name:site_name 
    description:description 
    latitude:latitude 
    longitude:longitude 
    street-address:streetAddress 
    locality:addressLocality 
    region:addressRegion 
    postal-code:postalCode 
    country-name:addressCountry 
    phone_number:telephone 
    email:email 

que pueda a continuación, almacene la información encontrada en un formato y vuelva a mostrarlos con la sintaxis de schema.org.

La otra parte es tipo determinante. Me gustaría modelar mis tablas después de schema.org y me gustaría saber el tipo de 'Cosa' (Thing) que sería un registro. Entonces, si analizo un tipo de gráfico abierto de 'barra', lo almacenaré como 'BarOrPub' (BarOrPub).

¿Hay una mejor manera de hacerlo? Algo automatizado? Una solución ya disponible? Cualquier entrada apreciada.

EDIT:

Así que estoy encontrando que este analiza bastante bien (donde all_tags incluye las etiquetas que me interesa como claves y equivalentes schema.org como el valor):

RDF::RDFa::Reader.open(url) do |reader| 
     reader.each_statement do |statement| 
      tag = statement.predicate.to_s.split('/')[-1].split('#')[-1] 
      Rails.logger.debug "rdf tag: #{tag}" 
      Rails.logger.debug "rdf predicate: #{statement.predicate}" 
      if all_tags.keys.include? tag 
      Rails.logger.debug "Found mapping for #{statement.predicate} and #{all_tags[tag]}" 
      results[all_tags[tag]] = statement.object.to_s.strip 
      end 
     end 
     end 

Respuesta

4

Para la pregunta original, estás en el camino correcto. De hecho, hacemos cosas similares en el structured-data.org linter. Puede ser útil que revises el repositorio de GitHub. La idea básica es formatear la detección y elegir el lector apropiado (RDFa, Microdata o lo que sea). Una vez leídos, tendrás un gráfico. Deseará ejecutar cada instrucción en el gráfico y crear un nuevo gráfico de salida con predicados y tipos asignados según su tabla. Entonces, por ejemplo, si dice dv: name como un predicado en el gráfico fuente, podría generar schema: name en el gráfico de salida.

La determinación del tipo también requerirá una tabla de asignación para obtener el tipo de salida apropiado. Tenga en cuenta que OGP en realidad no usa rdf: type, por lo que deberá encontrar una declaración con ogp: type y generar un rdf: type junto con la clase mapeada.

Otra forma de abordar todo esto sería crear un vocabulario con las afirmaciones owl: equivalentProperty/equivalentClass y realizar la vinculación OWL para agregar las tripletas adecuadas al gráfico original. El conjunto de herramientas de Ruby no está (todavía) bastante al respecto en este momento.

+1

Gracias por la validación! El enfoque alternativo suena como el más limpio y confiable. – imorsi

4

En cuanto a las asignaciones de Schema.org, estamos recopilando enlaces relevantes al http://www.w3.org/wiki/WebSchemas. Si produces alguna nueva, por favor agrégala.

Consulte también:

En algún momento' Sin duda, toparemos con mapeos que van más allá del simple "esto es lo mismo" o "esto implica que" los patrones triples.Debería poder ir más lejos utilizando consultas SPARQL, particularmente si tiene un motor SPARQL compatible con v1.1. Y, finalmente, las tareas de mapeo a veces requieren un código personalizado.

+0

Esos son recursos geniales, ¡gracias! – imorsi

Cuestiones relacionadas