neo4j:'pasos' opcionales en la consulta Cypher
Pregunta
Estoy tratando de encontrar relaciones entre nodos con nodos/relaciones intermedias opcionales pero específicas (neo4j 2.0 M6).
En mi modelo de datos, 'Gene' puede ser 'PARTOF' de un 'Grupo'.Tengo relaciones 'INTERACTUAR' entre 'Gene'-'Gene', 'Gene'-'Grupo' y 'Grupo'-'Grupo' (líneas rojas en la imagen del modelo).
Quiero resumir esto a todas las relaciones 'INTERACTUAR' entre 'Gene':ambos directos (Gene-INTERACT-Gene)
y a través de uno o dos 'Grupos' (Gene-PARTOF-Group-INTERACT-Gene)
.
Por supuesto, esto es fácil con múltiples consultas Cypher:
# direct INTERACT
MATCH (g1:Gene)-[r:INTERACT]-(g2:Gene) RETURN g1, g2
# INTERACT via one Group
MATCH (g1:Gene)-[:PARTOF]-(gr:Group)-[r:INTERACT]-(g2:Gene) RETURN g1, g2
# INTERACT via two Group
MATCH (g1:Gene)-[:PARTOF]-(gr1:Group)-[r:INTERACT]-(gr2:Group)-[:PARTOF]-(g2:Gene)
RETURN g1, g2
Pero, ¿sería posible construir una única consulta Cypher que tome 'pasos de grupo' opcionales en la ruta?Hasta ahora solo usé relaciones opcionales y shortestPaths
, pero no tengo idea si puedo filtrar uno o dos nodos opcionales entre dos genes.
Solución
Puede asignar una profundidad entre cero y uno para cada una de las relaciones que agregue al camino.Prueba algo como
MATCH (g1:Gene)-[:PARTOF*0..1]-(gr1)-[:INTERACT]-(gr2)-[:PARTOF*0..1]-(g2:Gene)
RETURN g1,g2
y para ver cómo se ven realmente las rutas coincidentes, simplemente devuelva la ruta completa
MATCH p=(g1:Gene)-[:PARTOF*0..1]-(gr1)-[:INTERACT]-(gr2)-[:PARTOF*0..1]-(g2:Gene)
RETURN p
Sin embargo, hay un poco de molestia al declarar etiquetas de nodos para las partes opcionales de este patrón, por lo que esta consulta supone que los genes no son parte de nada más que grupos, y que solo interactúan con grupos y otros genes.Si un gen puede tener [:PARTOF]
a otra cosa, entonces (gr1)
vinculará ese algo y la consulta ya no será confiable.Simplemente agregando una cláusula donde como
WHERE gr1:Group AND gr2:Group
excluye el caso en el que las partes opcionales no coinciden, por lo que no funcionará (sería como su tercera consulta).Estoy seguro de que se puede resolver, pero si su modelo real no es mucho más complejo de lo que describe en su pregunta, debería hacerlo.
Me tomé la libertad de interpretar tu modelo en una consola. aquí, compruébalo para ver si hace lo que quieres.