sheet - neo4j tutorial
¿Qué hace una coma en una consulta Cypher? (2)
Brian hace un buen trabajo explicando cómo se puede usar la coma para construir patrones de subgráfico más grandes, pero también hay una diferencia sutil pero importante entre usar la coma y una segunda cláusula de MATCH
.
Considere el gráfico simple de dos nodos con una relación entre ellos. La consulta
MATCH ()-->() MATCH ()-->() RETURN 1
devolverá una fila con el número 1. Reemplace el segundo MATCH
con una coma, sin embargo, y no se devolverán filas en absoluto:
MATCH ()-->(), ()-->() RETURN 1
Esto se debe a la noción de singularidad de la relación . Dentro de cada cláusula de MATCH
, cada relación se atravesará solo una vez. Eso significa que para mi segunda consulta, la primera relación en el gráfico se corresponderá con el primer patrón, y el segundo patrón no podrá hacer coincidir nada, lo que provocará que el patrón completo no coincida. Mi primera consulta coincidirá con la relación una vez en cada una de las cláusulas, y así creará una fila para el resultado.
Lea más sobre esto en el manual de Neo4j: http://neo4j.com/docs/stable/cypherdoc-uniqueness.html
Un compañero de trabajo codificó algo como esto:
match (a)-[r]->(b), (c) set c.x=y
¿Qué hace la coma? ¿Es solo una abreviatura de MATCH?
Como la sintaxis de ASCII-art de Cypher solo puede permitirle especificar una cadena lineal de conexiones en una fila, la coma está ahí, al menos en parte, para permitirle especificar cosas que pueden ramificarse. Por ejemplo:
MATCH (a)-->(b)<--(c), (b)-->(d)
Eso representa tres nodos que están todos conectados a b
(dos relaciones entrantes y una relación saliente.
La coma también puede ser útil para separar líneas si tu coincidencia es demasiado larga, así:
MATCH
(a)-->(b)<--(c),
(c)-->(d)
Obviamente esa no es una línea muy larga, pero eso es equivalente a:
MATCH
(a)-->(b)<--(c)-->(d)
Pero en general, cualquier instrucción MATCH
especifica un patrón que desea buscar. Todas las partes de ese MATCH
forman el patrón. En su caso, en realidad busca dos patrones inconexos ( (a)-[r]->(b)
y (c)
) por lo que Neo4j encontrará cada combinación de cada instancia de ambos patrones, lo que podría ser muy costoso. . En Neo4j 2.3 probablemente también recibirás una advertencia acerca de que se trata de una consulta que te daría un producto cartesiano.
Sin embargo, si especifica varias coincidencias, está pidiendo que busque diferentes patrones. Entonces si lo hiciste:
MATCH (a)-[r]->(b)
MATCH (c)
Conceptualmente, creo que es un poco diferente, pero el resultado es el mismo. Sin embargo, sé que definitivamente es diferente con el OPTIONAL MATCH
. Si lo hiciste:
MATCH (a:Foo)
OPTIONAL MATCH (a)-->(b:Bar), (a)-->(c:Baz)
Solo encontrará instancias donde hay un nodo Foo
conectado a nada, o conectado a una Bar
y un nodo Baz
. Mientras que si haces esto:
MATCH (a:Foo)
OPTIONAL MATCH (a)-->(b:Bar)
OPTIONAL MATCH (a)-->(c:Baz)
Encontrarás todos los nodos Foo
, e igualarás cero o más nodos Bar
y Baz
conectados de forma independiente.
EDITAR:
En los comentarios, Stefan Armbruster destacó que las comas también se pueden usar para asignar subpatrones a identificadores individuales. Como en:
MATCH path1=(a)-[:REL1]->(b), path2=(b)<-[:REL2*..10]-(c)
Gracias Stefan!
EDIT2: Ver también la respuesta de Mats a continuación