relaciones instalar crear borrar properties neo4j match relationship cypher

properties - instalar - Propiedad de nodo de coincidencia Neo4j O propiedad de relación



manual neo4j (1)

Intento escribir una consulta que devolverá nodos que coincidan con una propiedad de nodo o una propiedad de relación.

Por ejemplo, quiero todos los nodos donde la propiedad del nombre es George O si el estado de la propiedad de la relación es "bueno". Tengo dos consultas que obtendrán los nodos para cada uno de estos:

MATCH (n) where n.name = ''George'' return n MATCH (n)-[r]-() where r.status = ''good'' return n

¿Hay alguna pregunta simple que podría escribir para obtener estos resultados combinados? Pensé que podría utilizar esta consulta opcional (a continuación), pero parecía haber entendido mal la cláusula de coincidencia opcional porque solo obtengo nodos desde la primera consulta.

MATCH (n) where n.name = ''George'' Optional MATCH (n)-[r]-() where r.status = ''good'' return distinct n


Para cuando se produce la coincidencia opcional, los únicos n nodos que existen para hacer que coincida la opción son los que ya coinciden con los primeros criterios. Tu puedes hacer

MATCH (n) WHERE n.name = ''George'' OR n-[{ status:"good" }]->() RETURN n

pero para gráficos más grandes, recuerde que esto no hará un uso eficiente de los índices.

Otra forma sería

MATCH (n {name:"George"}) RETURN n UNION MATCH (n)-[{status:"good"})->() RETURN n

Esto debería funcionar mejor con los índices para el primer partido, suponiendo que use una etiqueta y tenga el índice relevante configurado (pero la segunda parte aún podría ser muy ineficiente).

Editar
Con respecto al comentario, la indexación de las relaciones haría que esa parte sea más rápida y correcta, pero en mi opinión sería mejor decir que es lenta porque el patrón está infradeterminado. El segundo patrón de coincidencia hace algo así como

  • enlazar todos los nodos en el gráfico a (n)
  • obtener todas las relaciones salientes (independientemente del tipo) de (n)
  • verificar la relación de status="good"

Puede mejorar el rendimiento con la indexación de relaciones, pero dado que una relación existe solo entre los dos nodos que se relacionan, puede pensar en ello como indexado por esos nodos. Es decir, corrija el primer punto al excluir los nodos cuyas relaciones no son relevantes. Las dos cláusulas de coincidencia podrían parecerse

MATCH (n:Person {name:"George"}) // add label to use index MATCH (n:Person)-[{status:"good"}]->() // add label to limit (n) -no indexing, but better than unlimited (n) MATCH (n:Person {name:"Curious"})-[{status:"good"}]->() // add label to use index -now the relationships are sort-of-indexed

y / o escribe la relación

MATCH (n)-[:REL {status:"good"}]->() // add type to speed up relationship retrieval

de hecho, con relaciones anónimas y propiedad rel, probablemente tendría sentido (viñeta tres) hacer que la propiedad sea del tipo, por lo que

MATCH (n)-[:GOOD]->() // absent type, it would make sense to use the property as type instead

Sus consultas reales pueden ser muy diferentes, y su pregunta no fue realmente sobre el rendimiento de las consultas :) bueno.