En este documento, se describen los errores que pueden surgir cuando trabajas con Spanner Graph. Ejemplos de errores y correcciones recomendadas .
Si necesitas más asistencia después de revisar esta guía de solución de problemas, consulta Obtén asistencia.
Errores de esquema
Los resultados del esquema se basan en el conjunto de datos que se usa en Configurar y consultar Spanner Graph.
Las claves de elementos deben tener una garantía de unicidad
Mensaje de error
Neither the primary keys nor any unique index defined on the property graph
element source table `Person` provides the uniqueness guarantee for graph
element `Person` belonging to the graph `FinGraph`. You want to redefine the
element key columns (`name`) based on the source table's primary keys, or
create a unique index on the element's key columns.
Ejemplo de error
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person KEY (name)
);
Corrección recomendada
Crear un índice único en las columnas de clave de elemento y volver a definir las columnas de clave de elemento en función de las claves primarias de la tabla fuente
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person KEY (id)
);
De forma alternativa, crea un índice único en las columnas de clave del elemento.
CREATE UNIQUE INDEX PersonNameIndex ON Person(name);
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person KEY (name)
);
Los nombres de las definiciones de los elementos deben ser únicos
Mensaje de error
Account is defined more than once; use a unique name.
Ejemplo de error
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Account,
Person
)
EDGE TABLES (
Account
SOURCE KEY(owner_id) REFERENCES Person
DESTINATION KEY(account_id) REFERENCES Account
);
Solución recomendada
Usa un nombre único para la definición perimetral.
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Account,
Person
)
EDGE TABLES (
Account AS Owns
SOURCE KEY(owner_id) REFERENCES Person
DESTINATION KEY(account_id) REFERENCES Account
);
La definición de la etiqueta debe ser coherente para las propiedades.
Mensaje de error
The label Entity is defined with different property declarations. There is one
instance of this label defined with properties of [id]. Another instance is
defined with properties of [name].
Ejemplo de error
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person LABEL Entity PROPERTIES (name),
Account LABEL Entity PROPERTIES (id)
);
Corrección recomendada
Debes usar el mismo conjunto de nombres de propiedades con la misma etiqueta.
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person LABEL Entity PROPERTIES (id, name),
Account LABEL Entity PROPERTIES (id, name)
);
La declaración de la propiedad debe ser coherente con el tipo de propiedad
Mensaje de error
The property declaration of name has type conflicts. There is an existing
declaration of type INT64. There is a conflicting one of type STRING.
Ejemplo de error
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person PROPERTIES (name),
Account PROPERTIES (id AS name)
);
Corrección recomendada
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person PROPERTIES (name),
Account PROPERTIES (CAST(id AS STRING) AS name)
);
La definición de la propiedad no debe ser una subconsulta.
Mensaje de error
Property value expression of count cannot contain a subquery.
Ejemplo de error
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person PROPERTIES ((SELECT COUNT(*) FROM Person) AS count)
);
Corrección recomendada
N/A. No se permite esta condición.
La definición de la propiedad debe ser coherente dentro de la misma definición del elemento
Mensaje de error
Property location has more than one definition in the element table Person
Ejemplo de error
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person
LABEL Person PROPERTIES (country AS location)
LABEL Entity PROPERTIES (city AS location)
);
Corrección recomendada
Usa la misma definición de propiedad.
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person
LABEL Person PROPERTIES (country AS location)
LABEL Entity PROPERTIES (country AS location)
);
Como alternativa, asigna diferentes nombres de propiedad.
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person
LABEL Person PROPERTIES (country AS location)
LABEL Entity PROPERTIES (city AS city)
);
Errores de consulta
Los resultados de la consulta se basan en el conjunto de datos que se usa en Configurar y consultar Spanner Graph.
Los elementos del gráfico no se pueden devolver como resultados de la consulta
Mensaje de error
Returning expressions of type GRAPH_ELEMENT is not allowed
Ejemplo de error
GRAPH FinGraph
MATCH (n:Account)
RETURN n;
Corrección recomendada
GRAPH FinGraph
MATCH (n:Account)
RETURN TO_JSON(n) AS n;
La especificación de propiedades no se puede usar con la cláusula WHERE
.
Mensaje de error
WHERE clause cannot be used together with property specification
Ejemplo de error
GRAPH FinGraph
MATCH (n:Account {id: 1} WHERE n.is_blocked)
RETURN n.id;
Solución recomendada
Puedes usar una de las correcciones sugeridas a continuación.
GRAPH FinGraph
MATCH (n:Account {id: 1})
WHERE n.is_blocked
RETURN n.id;
GRAPH FinGraph
MATCH (n:Account WHERE n.id = 1 AND n.is_blocked )
RETURN n.id;
GRAPH FinGraph
MATCH (n:Account {id: 1, is_blocked: TRUE})
RETURN n.id;
No se permite hacer referencia a variables definidas en declaraciones anteriores
Mensaje de error
Name 'account_id', defined in the previous statement, can only be referenced in
the outermost WHERE clause of MATCH
Descripción
No se permite la referencia a variables definidas en sentencias anteriores dentro del patrón MATCH
. En la consulta por grafos, los nombres definidos por instrucciones anteriores pueden
Solo debe usarse en la cláusula WHERE
más externa de MATCH
.
Ejemplo de error
GRAPH FinGraph
LET account_id = 1
MATCH (n:Account {id: account_id})
RETURN n.id;
Corrección recomendada
GRAPH FinGraph
LET account_id = 1
MATCH (n:Account)
WHERE n.id = account_id
RETURN n.id;
No se permite redefinir una variable de gráfico correlacionada.
Mensaje de error
The name account is already defined; redefining graph element variables in a
subquery is not allowed. To refer to the same graph element, use a different
name and add an explicit filter that checks for equality.
Descripción
En la consulta de grafos, los nombres de los elementos del gráfico no se pueden redefinir en un gráfico interno. subconsulta. Esta situación podría interpretarse como una referencia al mismo gráfico elemento como el alcance externo o como vinculación a nuevos elementos del gráfico, que cubren el nombre del alcance externo. No se puede redefinir.
Ejemplo de error
GRAPH FinGraph
MATCH (account:Account)
RETURN account.id AS account_id, VALUE {
MATCH (account:Account)-[transfer:Transfers]->(:Account)
RETURN SUM(transfer.amount) AS total_transfer
} AS total_transfer;
Solución recomendada
GRAPH FinGraph
MATCH (account:Account)
RETURN account.id AS account_id, VALUE {
MATCH (a:Account)-[transfer:Transfers]->(:Account)
WHERE a = account
RETURN SUM(transfer.amount) AS total_transfer
} AS total_transfer;
Problemas semánticos de consultas
Los resultados de la consulta se basan en el conjunto de datos que se usa en Configurar y consultar Spanner Graph.
Los diferentes WHERE
y FILTER
dan como resultado diferentes resultados.
Descripción
FILTER
es una sentencia. WHERE
es una cláusula, como parte de las sentencias MATCH
, OPTIONAL
MATCH
.
En el primer ejemplo, la cláusula WHERE
agrega restricciones adicionales a los patrones descritos en la sentencia OPTIONAL MATCH
. Este no es un filtro después de
finaliza la coincidencia.
En el segundo ejemplo, la sentencia FILTER
es un filtro luego de que la coincidencia se
finalizado.
Problema de ejemplo
Los siguientes ejemplos tienen resultados diferentes porque WHERE
y FILTER
son
es diferente.
Ejemplo 1
GRAPH FinGraph
MATCH (n:Account {id: 7})
OPTIONAL MATCH (m:Account)
WHERE FALSE
RETURN n.id AS n_id, m.id AS m_id;
n_id | m_id |
---|---|
7 | null |
Ejemplo 2
GRAPH FinGraph
MATCH (n:Account {id: 7})
OPTIONAL MATCH (m:Account)
FILTER FALSE
RETURN n.id AS n_id, m.id AS m_id;
Resultados vacíos.
Las diferentes variables propagadas en las instrucciones dan como resultado diferentes salidas
Descripción
En el lenguaje de consulta de grafos, una variable declarada varias veces se refiere a la el mismo elemento del gráfico en todos los casos.
En el ejemplo 1, no hay un nodo Account
cuyo id
sea 7
y 16
. Como
se devuelven resultados vacíos.
En el ejemplo 2, el nombre n
no se muestra desde la sentencia anterior (solo se muestra id
). Por lo tanto, el segundo MATCH
encuentra el nodo Account
cuyo
id
es 16
.
Problema de ejemplo
Los siguientes ejemplos tienen salidas diferentes porque las diferentes variables se se propagan entre las sentencias.
Ejemplo 1
GRAPH FinGraph
MATCH (n:Account {id: 7})
RETURN n
NEXT
MATCH (n:Account {id: 16})
RETURN n.id AS n_id;
Resultados vacíos.
Ejemplo 2
GRAPH FinGraph
MATCH (n:Account {id: 7})
RETURN n.id AS id
NEXT
MATCH (n:Account {id: 16})
RETURN n.id AS n_id;
n_id |
---|
16 |
ORDER BY
se ignora si hay una sentencia exitosa que no sea LIMIT
.
Descripción
En el lenguaje de consulta de grafos, la instrucción ORDER BY
se ignora, a menos que una de
lo siguiente es verdadero:
ORDER BY
es la última sentencia.LIMIT
es seguido inmediatamente porORDER BY
.
En el ejemplo 1, LIMIT
no sigue inmediatamente a ORDER BY
. la final
LIMIT
está separado. Esto significa que el motor ignora ORDER BY
.
En el ejemplo 2, ORDER BY
es aplicable porque LIMIT
sigue de inmediato
ORDER BY
Problema de ejemplo
Los siguientes ejemplos tienen resultados diferentes porque ORDER BY
se ignora cuando se usa sin LIMIT
en el ejemplo 1.
Ejemplo 1
GRAPH FinGraph
MATCH (n:Account)
ORDER BY n.id DESC
RETURN n.id
LIMIT 3;
n_id |
---|
7 |
Ejemplo 2
GRAPH FinGraph
MATCH (n:Account)
ORDER BY n.id DESC
LIMIT 3
RETURN n.id;
n_id |
---|
20 |
Los diferentes patrones de borde generan distintas salidas.
Descripción
En el conjunto de datos que se usa en el ejemplo del error, el patrón de borde de dirección ANY
coincide con cada borde Transfers
del gráfico dos veces.
En el ejemplo 1, una arista Transfers
de Account(id=x)
a Account(id=y)
puede
coincidir dos veces, de la siguiente manera:
- n=
Account(id=x)
, m=Account(id=y)
- n=
Account(id=y)
, m=Account(id=x)
Solo hay una coincidencia en el ejemplo 2, en la que n=Account(id=x)
y m=Account(id=y)
.
Como resultado, la consulta del ejemplo 1 muestra 10
y la consulta del ejemplo 2.
muestra 5
.
Problema de ejemplo
Los siguientes ejemplos tienen salidas diferentes porque hay patrones de borde distintos se usan las reglas de firewall.
Ejemplo 1
GRAPH FinGraph
MATCH (n:Account)-[:Transfers]-(m:Account)
RETURN COUNT(*) AS num_transfer_edges;
num_transfer_edges |
---|
10 |
Ejemplo 2
GRAPH FinGraph
MATCH (n:Account)-[:Transfers]->(m:Account)
RETURN COUNT(*) AS num_transfer_edges;
num_transfer_edges |
---|
5 |
Errores de mutación
Los resultados de la mutación se basan en el conjunto de datos utilizado en Configuración y consulta Spanner Graph.
Falta un nodo de origen que infringe la restricción de clave externa
Mensaje de error
Parent row for row [...] in table AccountTransferAccount is missing. Row cannot
be written.
Descripción
La tabla perimetral de AccountTransferAccount
está INTERLEAVED INTO PARENT Account node
desde una tabla de particiones. Para crear el borde Transfer
, su nodo superior Account
debe
ya existen.
Ejemplo de error
INSERT INTO AccountTransferAccount (id, to_id, create_time, amount)
VALUES (100, 1, PENDING_COMMIT_TIMESTAMP(), 200);
Corrección recomendada
Primero, crea el nodo Account
inicial y, luego, crea el borde Transfer
.
La falta de un nodo de destino infringe la restricción de clave externa
Mensaje de error
Foreign key constraint FK_TransferTo is violated on table
AccountTransferAccount. Cannot find referenced values in Account(id)
Descripción
La tabla AccountTransferAccount
hace referencia a Accounttable
a través de un
ForeignKey
se ha llamado FK_TransferTo
. Para crear el borde Transfer
,
El nodo de cola Account
al que se hace referencia ya debe existir.
Ejemplo de error
INSERT INTO AccountTransferAccount (id, to_id, create_time, amount)
VALUES (1, 100, PENDING_COMMIT_TIMESTAMP(), 200);
Corrección recomendada
Primero, crea el nodo de la cuenta de final y, luego, crea el perímetro Transfer
.
El borde saliente huérfano infringe la relación superior-secundario
Mensaje de error
Integrity constraint violation during DELETE/REPLACE. Found child row [...] in
table AccountTransferAccount
Descripción
La tabla perimetral de AccountTransferAccount
tiene INTERLEAVED INTO PARENT
nodo Account
tabla y el nodo Account
que se borrará aún tiene bordes salientes vinculados
que la modifica.
Ejemplo de error
DELETE FROM Account WHERE id = 1;
Corrección recomendada
Primero, borra todos los bordes Transfer
salientes y, luego, borra el nodo Account
.
Como alternativa, define ON DELETE CASCADE
para INTERLEAVE
y haz que Spanner borre automáticamente esos bordes.
El borde entrante huérfano infringe la relación superior-secundario
Mensaje de error
Foreign key constraint violation when deleting or updating referenced row(s):
referencing row(s) found in table AccountTransferAccount
Descripción
La tabla de aristas AccountTransferAccount
hace referencia a la tabla de nodos Account
a través de un ForeignKey
, y el nodo Account
que se borrará aún tiene aristas entrantes adjuntas.
Ejemplo de error
DELETE FROM Account WHERE id = 1;
Solución recomendada
Primero, borra todos los bordes Transfer
entrantes y, luego, borra el nodo Account
.
Como alternativa, define ON DELETE CASCADE
para ForeignKey
y que Spanner las borre automáticamente
en los bordes.