Neo4j: Combina varias etiquetas (2 o más)


Me gustaría hacer una búsqueda, y me gustaría comenzar a recorrer desde 2 etiquetas (O condición). Por ejemplo, necesito encontrar todos los nodos que tienen etiquetas 'Male' o ' Female 'y cuya propiedad, name=~'. ail.'.

Author: Daniel Krizian, 2013-11-15

3 answers

Puedes poner eso en la cláusula WHERE:

MATCH n
WHERE n:Male OR n:Female
RETURN n

EDITAR

Como @tbaum señala esto realiza un AllNodesScan. Escribí la respuesta cuando las etiquetas eran bastante nuevas y esperaba que el planificador de consultas finalmente lo implementara con un NodeByLabelScan para cada etiqueta, como lo hace para el caso de etiqueta única

MATCH n
WHERE n:Male
RETURN n

Todavía creo que esta es una expresión razonable de la consulta y que es razonable esperar que el planificador de consultas lo implemente con escaneos de etiquetas, pero a partir de Neo4j 2.2.3 la consulta todavía se implementa con un AllNodesScan y un filtro de etiquetas. Por lo tanto, aquí hay una alternativa más detallada. Dado que la disyunción de etiqueta significa una unión de conjunto y esta unión se puede expresar de diferentes maneras, podemos expresarla de una manera que el planificador de consultas implementa sin escanear todos los nodos, y en su lugar comienza con un NodeByLabelScan por etiqueta.

MATCH (n:Male)
WHERE n.name =~ '.ail.'
RETURN n
UNION MATCH (n:Female)
WHERE n.name =~ '.ail.'
RETURN n

Esto significa expresar la consulta una vez para cada etiqueta y unirlas con un UNION explícito. Esto no es irrazonable, al menos para menor número de etiquetas, pero no está claro para mí por qué los planificadores de consultas no deberían ser capaces de inferir la misma implementación de la consulta más simple, así que he abierto un problema de github aquí.

 36
Author: jjaderberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-20 08:59:58
MATCH n WHERE n:Label1 OR n:Label2

... resultará en un AllNodesScan esto es una mala idea!

Tal vez una mejor solución:

OPTIONAL MATCH (n1:Label1)
WITH collect(distinct n1) as c1

OPTIONAL MATCH (n2:Label2) 
WITH collect(distinct n2) + c1 as c2

OPTIONAL MATCH (n3:Label3) 
WITH collect(distinct n3) + c2 as c3

UNWIND c3 as nodes
RETURN count(nodes),labels(nodes) 
 14
Author: tbaum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-22 15:27:43

La documentación para la v3.0 dice esto:

También se puede describir un nodo que tiene varias etiquetas:

(a:User:Admin)-->(b)

Fuente: https://neo4j.com/docs/developer-manual/current/cypher/#_labels

 -1
Author: daniel_amigos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-03 18:15:32