En este documento se describen los errores que pueden producirse al trabajar con Spanner Graph. También se proporcionan ejemplos de errores y correcciones recomendadas.
Si necesitas más ayuda después de consultar esta guía para solucionar problemas, consulta la sección Obtener asistencia.
Errores de esquema
Los resultados del esquema se basan en el conjunto de datos utilizado en Configurar y consultar Spanner Graph.
Las claves de los 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
Crea un índice único en las columnas de clave de elemento y redefine las columnas de clave de elemento en función de las claves principales de la tabla de origen.
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person KEY (id)
);
También puede crear un índice único en las columnas de clave de 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 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
);
Corrección recomendada
Usa un nombre único para la definición de borde.
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 en todas 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
Debe usar el mismo conjunto de nombres de propiedad 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. Esta condición no está permitida.
La definición de la propiedad debe ser coherente en la misma definición de 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
Utilice 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)
);
También puedes asignar nombres de propiedad diferentes.
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 las consultas se basan en el conjunto de datos utilizado en Configurar y consultar Spanner Graph.
Los elementos de gráfico no se pueden devolver como resultados de una 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;
No se puede usar la especificación de propiedad 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;
Corrección recomendada
Puedes usar una de las siguientes correcciones sugeridas.
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 instrucciones 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 hacer referencia a variables definidas en instrucciones anteriores en el patrón MATCH
. En la consulta de gráfico, los nombres definidos por instrucciones anteriores solo se pueden usar 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 gráfico, los nombres de los elementos del gráfico no se pueden volver a definir en una subconsulta de gráfico interno. Este caso se puede interpretar como una referencia al mismo elemento del gráfico que el ámbito externo o como una vinculación a elementos del gráfico nuevos, que ocultan el nombre del ámbito externo. No se permite 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;
Correcció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 con la semántica de las consultas
Los resultados de las consultas se basan en el conjunto de datos utilizado en Configurar y consultar Spanner Graph.
Las diferentes WHERE
y FILTER
dan lugar a resultados distintos
Descripción
FILTER
es una instrucción; WHERE
es una cláusula, como parte de las instrucciones MATCH
y OPTIONAL
MATCH
.
En el primer ejemplo, la cláusula WHERE
añade restricciones adicionales a los patrones descritos en la instrucción OPTIONAL MATCH
. No se trata de un filtro posterior a la finalización de la coincidencia.
En el segundo ejemplo, la instrucción FILTER
es un filtro que se aplica después de que se haya completado la coincidencia.
Ejemplo de problema
Los siguientes ejemplos tienen resultados diferentes porque WHERE
y FILTER
son diferentes.
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 lugar a resultados diferentes
Descripción
En el lenguaje de consulta de gráficos, una variable declarada varias veces hace referencia al mismo elemento de gráfico en todas las apariciones.
En el ejemplo 1, no hay ningún nodo Account
cuyo id
sea 7
y 16
. Por lo tanto, se devuelven resultados vacíos.
En el ejemplo 2, el nombre n
no se devuelve de la instrucción anterior (solo se devuelve id
). Por lo tanto, el segundo MATCH
busca el nodo Account
cuyo id
es 16
.
Ejemplo de problema
Los siguientes ejemplos tienen resultados diferentes porque se propagan variables distintas entre las instrucciones.
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 instrucción posterior que no sea LIMIT
Descripción
En el lenguaje de consulta de gráficos, la instrucción ORDER BY
se ignora a menos que se cumpla una de las siguientes condiciones:
ORDER BY
es la última instrucción.ORDER BY
va inmediatamente después deLIMIT
.
En el ejemplo 1, LIMIT
no va inmediatamente después de ORDER BY
; el último LIMIT
está separado. Esto significa que el motor ignora ORDER BY
.
En el ejemplo 2, se aplica ORDER BY
porque LIMIT
sigue inmediatamente a ORDER BY
.
Ejemplo de problema
Los siguientes ejemplos tienen resultados diferentes porque la instrucción 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 dan lugar a resultados distintos
Descripción
En el conjunto de datos usado en el ejemplo de 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)
se puede encontrar dos veces, como se indica a continuación:
- n=
Account(id=x)
, m=Account(id=y)
- n=
Account(id=y)
, m=Account(id=x)
En el ejemplo 2, solo hay una coincidencia, donde n=Account(id=x)
y m=Account(id=y)
.
Por lo tanto, la consulta del ejemplo 1 devuelve 10
y la del ejemplo 2 devuelve 5
.
Ejemplo de problema
Los siguientes ejemplos tienen resultados diferentes porque se usan patrones de borde distintos.
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 las mutaciones se basan en el conjunto de datos utilizado en Configurar y consultar Spanner Graph.
Falta el nodo de origen, lo 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 de borde AccountTransferAccount
es INTERLEAVED INTO PARENT Account node
table. Para crear el Transfer
perimetral, debe existir el nodo Account
principal.
Ejemplo de error
INSERT INTO AccountTransferAccount (id, to_id, create_time, amount)
VALUES (100, 1, PENDING_COMMIT_TIMESTAMP(), 200);
Corrección recomendada
Crea primero el nodo Account
y, después, la arista Transfer
.
Falta el nodo de destino, lo que 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
mediante un
ForeignKey
llamado FK_TransferTo
. Para crear el borde Transfer
, el nodo de seguimiento 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
Crea primero el nodo Account final y, a continuación, crea la arista Transfer
.
La arista saliente huérfana infringe la relación entre el elemento superior y el secundario
Mensaje de error
Integrity constraint violation during DELETE/REPLACE. Found child row [...] in
table AccountTransferAccount
Descripción
La tabla de aristas AccountTransferAccount
es un nodo INTERLEAVED INTO PARENT
Account
y el nodo Account
que se va a eliminar aún tiene aristas salientes asociadas.
Ejemplo de error
DELETE FROM Account WHERE id = 1;
Corrección recomendada
Elimina primero todas las aristas Transfer
salientes y, a continuación, elimina el nodo Account
.
También puedes definir
ON DELETE CASCADE
para INTERLEAVE
y hacer que Spanner elimine automáticamente esas aristas.
La arista entrante huérfana infringe la relación entre el elemento superior y el 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 va a eliminar aún tiene aristas entrantes asociadas.
Ejemplo de error
DELETE FROM Account WHERE id = 1;
Corrección recomendada
Elimina primero todas las aristas Transfer
entrantes y, a continuación, elimina el nodo Account
.
También puedes definir ON DELETE CASCADE
para ForeignKey
y hacer que Spanner elimine automáticamente esas
aristas.