Conformidad con los estándares de SPARQL en Amazon Neptune - Amazon Neptune

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Conformidad con los estándares de SPARQL en Amazon Neptune

Tras enumerar los estándares de SPARQL aplicables, en las siguientes secciones se proporcionan detalles específicos sobre cómo la implementación de SPARQL de Neptune amplía o se aparta de dichos estándares.

Amazon Neptune cumple los siguientes estándares en la implementación del lenguaje de consulta de gráficos SPARQL.

Estándares aplicables de SPARQL

Prefijos de espacio de nombres predeterminados en Neptune SPARQL

Neptune define los siguientes prefijos de forma predeterminada para su uso en consultas de SPARQL. Para obtener más información, consulte Nombres con prefijos en la especificación de SPARQL.

  • rdf  – http://www.w3.org/1999/02/22-rdf-syntax-ns#

  • rdfs – http://www.w3.org/2000/01/rdf-schema#

  • owl  – http://www.w3.org/2002/07/owl#

  • xsd  – http://www.w3.org/2001/XMLSchema#

Gráfico predeterminado SPARQL y gráficos con nombre

Amazon Neptune asocia cada triple con un gráfico con nombre. El gráfico predeterminado se define como la unión de todos los gráficos con nombre.

Gráfico predeterminado para consultas

Si envía una consulta SPARQL sin especificar explícitamente un gráfico mediante la palabra clave GRAPH o construcciones como FROM NAMED, Neptune siempre tiene en cuenta todos los triples en su instancia de base de datos. Por ejemplo, la siguiente consulta devuelve todos los triples desde un punto de conexión de SPARQL de Neptune:

SELECT * WHERE { ?s ?p ?o }

Los triples que aparecen en más de un gráfico se devuelven solo una vez.

Para obtener información sobre la especificación de gráfico predeterminado, consulte la sección Conjunto de datos de RDF de la especificación del lenguaje de consulta SPARQL 1.1.

Especificación del gráfico con nombre para carga, inserciones o actualizaciones

Si no especifica un gráfico con nombre al cargar, insertar o actualizar triples, Neptune utiliza el gráfico con nombre alternativo definido por el URI http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph.

Cuando emite una solicitud Load de Neptune utilizando un formato basado en triples, se puede especificar el gráfico con nombre que se va a utilizar para todos los triples mediante el parámetro parserConfiguration: namedGraphUri. Para obtener información acerca de la sintaxis del comando Load, consulte Comando del programa de carga de Neptune.

importante

Si no utiliza este parámetro y no especifica un gráfico con nombre, se utiliza la URI alternativa: http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph.

También se utiliza este gráfico con nombre alternativo si se cargan triples a través de SPARQL UPDATE sin proporcionar explícitamente un destino de gráfico con nombre.

Puede utilizar el formato N-Quads basado en cuádruples para especificar un gráfico con nombre para cada triple en la base de datos.

nota

El uso de N-Quads le permite dejar el gráfico con nombre en blanco. En este caso, se usa http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph.

Puede anular el gráfico con nombre predeterminado para N-Quads con la opción de configuración del analizador namedGraphUri.

Funciones del constructor XPath de SPARQL compatibles con Neptune

El estándar SPARQL permite que los motores SPARQL admitan un conjunto ampliable de funciones de constructores de XPath. Neptune admite actualmente las siguientes funciones de constructores, donde el prefijo xsd se define como http://www.w3.org/2001/XMLSchema#:

  • xsd:boolean

  • xsd:integer

  • xsd:double

  • xsd:float

  • xsd:decimal

  • xsd:long

  • xsd:unsignedLong

IRI base predeterminado para consultas y actualizaciones

Dado que un clúster de Neptune tiene varios puntos de conexión diferentes, el uso de la URL de solicitud de una consulta o actualización como IRI base podría generar resultados inesperados al resolver los IRI relativos.

A partir de la versión 1.2.1.0 del motor, Neptune utiliza http://aws.amazon.com/neptune/default/ como IRI base si no hay una IRI base explícita que forme parte de la solicitud.

En la siguiente solicitud, el IRI base forma parte de la solicitud:

BASE <http://example.org/default/> INSERT DATA { <node1> <id> "n1" } BASE <http://example.org/default/> SELECT * { <node1> ?p ?o }

Y el resultado sería:

?p ?o http://example.org/default/id n1

Sin embargo, en esta solicitud no se incluye ningún IRI base:

INSERT DATA { <node1> <id> "n1" } SELECT * { <node1> ?p ?o }

En ese caso, el resultado sería:

?p ?o http://aws.amazon.com/neptune/default/id n1

Valores xsd:dateTime en Neptune

Por razones de rendimiento, Neptune siempre almacena valores de fecha/hora como hora universal coordinada (UTC). Esto hace que las comparaciones directas sean muy eficientes.

Esto también significa que, si introduce un valor dateTime que especifica una zona horaria determinada, Neptune traduce el valor a UTC y descarta esa información de zona horaria. A continuación, cuando recupere el valor dateTime más tarde, se expresará en UTC, no en la hora de la zona horaria original, y no podrá indicar cuál era la zona horaria original.

Gestión de Neptune de los valores especiales de coma flotante

Neptune gestiona los valores especiales de coma flotante en SPARQL de la siguiente manera.

Gestión de NaN de SPARQL en Neptune

En Neptune, SPARQL puede aceptar un valor de NaN en una consulta. No se hace ninguna distinción entre los valores de señalización y los valores NaN silenciosos. Neptune trata todos los valores NaN como silenciosos.

Semánticamente, no es posible ninguna comparación de un valor NaN, porque nada es mayor, menor o igual que NaN. Esto significa que un valor de NaN en un lado de una comparación en teoría nunca coincide con nada del otro lado.

Sin embargo, la especificación XSD trata dos valores xsd:double o xsd:float de NaN como iguales. Neptune hace esto para el filtro IN, para el operador igual en las expresiones de filtro y para la semántica de coincidencia (que tiene a NaN en la posición del objeto de un patrón triple).

Gestión de valores infinitos de SPARQL en Neptune

En Neptune, SPARQL puede aceptar un valor de INF o -INF en una consulta. INF es mayor que cualquier otro valor numérico y -INF es menor que cualquier otro valor numérico.

Dos valores INF con signos coincidentes se comparan como iguales entre sí independientemente del tipo (por ejemplo, un flotante -INF se compara como igual a un -INF doble).

Por supuesto, no es posible ninguna comparación con NaN porque nada es mayor, menor o igual que NaN.

Gestión de cero negativo de SPARQL en Neptune

Neptune normaliza un valor cero negativo a un cero sin signo. Puede utilizar los valores cero negativos se pueden utilizar en una consulta, pero no se registran como tales en la base de datos y se comparan como iguales a ceros sin signo.

Limitación en Neptune de los valores de longitud arbitraria

Neptune limita el tamaño de almacenamiento de valores de enteros, coma flotante y decimales XSD en SPARQL a 64 bits. Si se utilizan valores mayores, se producirá un error InvalidNumericDataException.

Neptune amplía la comparación de valores iguales en SPARQL

El estándar SPARQL define una lógica ternaria para las expresiones de valor, donde una expresión de valor puede evaluar a true, false o error. La semántica predeterminada para la igualdad de términos tal y como se define en la especificación SPARQL 1.1, que se aplica a las comparaciones = y != en condiciones FILTER, produce un error al comparar los tipos de datos que no son explícitamente comparables en la tabla de operadores en la especificación.

Este comportamiento puede conllevar resultados poco intuitivos, como en el siguiente ejemplo.

Datos:

<http://example.com/Server/1> <http://example.com/ip> "127.0.0.1"^^<http://example.com/datatype/IPAddress>

Consulta 1:

SELECT * WHERE { <http://example.com/Server/1> <http://example.com/ip> ?o . FILTER(?o = "127.0.0.2"^^<http://example.com/datatype/IPAddress>) }

Consulta 2:

SELECT * WHERE { <http://example.com/Server/1> <http://example.com/ip> ?o . FILTER(?o != "127.0.0.2"^^<http://example.com/datatype/IPAddress>) }

Con la semántica de SPARQL predeterminada que Neptune usaba antes de la versión 1.0.2.1, ambas consultas devolverían el resultado vacío. La razón es que, cuando ?o = "127.0.0.2"^^<http://example.com/IPAddress> se evalúa para ?o := "127.0.0.1"^^<http://example.com/IPAddress>, se produce un error distinto de false porque no hay reglas de comparación explícitas especificadas para el tipo de datos personalizados <http://example.com/IPAddress>. Como resultado, la versión negada en la segunda consulta también produce un error. En ambas consultas, el error provoca que se excluya la solución candidata.

A partir de la versión 1.0.2.1, Neptune ha ampliado el operador de desigualdad de SPARQL de acuerdo con la especificación. Consulte la sección SPARQL 1.1 sobre la extensibilidad de operadores, que permite a los motores definir reglas adicionales sobre cómo efectuar la comparación entre tipos de datos integrados definidos por el usuario y no comparables.

Mediante esta opción, Neptune ahora trata una comparación de dos tipos de datos cualesquiera que no estén explícitamente definidos en la tabla de mapeo de operadores como si se evaluaran en true si los valores literales y los tipos de datos son sintácticamente iguales y en false en caso contrario. En cualquier caso no se produce un error.

Con esta nueva semántica, la segunda consulta devolvería "127.0.0.1"^^<http://example.com/IPAddress> en lugar de un resultado vacío.

Gestión de literales fuera de rango en SPARQL de Neptune

La semántica XSD define cada tipo numérico con su espacio de valor, excepto para integer y decimal. Estas definiciones limitan cada tipo a un rango de valores. Por ejemplo, el rango de un rango xsd:byte va de -128 a +127, ambos incluidos. Cualquier valor fuera de este rango no se considera válido.

Si intenta asignar un valor literal fuera del espacio de valores de un tipo (por ejemplo, si intenta establecer un xsd:byte valor literal de 999), Neptune acepta el out-of-range valor tal cual, sin redondearlo ni truncarlo. Pero no lo conserva como un valor numérico ya que el tipo determinado no puede representarlo.

Es decir, Neptune acepta "999"^^xsd:byte aunque sea un valor fuera del rango de valores xsd:byte definido. Sin embargo, después de que el valor se conserve en la base de datos, solo se puede utilizar en la semántica de coincidencia exacta, en una posición de objeto de un patrón triple. No se puede ejecutar ningún filtro de rango en él porque los out-of-range literales no se tratan como valores numéricos.

La especificación de SPARQL 1.1 define operadores de rango con el formato numeric-operador-numeric, string-operador-string, literal-operador-literal, etc. Neptune no puede ejecutar un operador de comparación de rangos con algo como invalid-literal-operador-numeric-value.