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).


enter image description here


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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top