Vorrei effettuare una ricerca e vorrei iniziare a passare da 2 etichette (condizione OR). Ad esempio, ho bisogno di scoprire tutti i nodi che hanno etichette "Male" o "Female" e la cui proprietà, name = ~ '. ail. '.Neo4j: abbina più etichette (2 o più)
risposta
Si può mettere che nella clausola WHERE
:
MATCH n
WHERE n:Male OR n:Female
RETURN n
EDIT
Come @tbaum sottolinea questo esegue un AllNodesScan
. Ho scritto la risposta quando le etichette erano abbastanza nuovo e mi aspettavo il pianificatore query per poi implementare con un NodeByLabelScan
per ogni etichetta, come avviene per il singolo caso dell'etichetta
MATCH n
WHERE n:Male
RETURN n
io continuo a pensare che questo è un ragionevole espressione della query e che è ragionevole aspettarsi che il pianificatore di query lo implementa con scansioni di etichette, ma a partire da Neo4j 2.2.3 la query è ancora implementata con un AllNodesScan
e un filtro di etichetta. Ecco quindi un'alternativa più prolissa. Poiché la disgiunzione dell'etichetta indica un'unione impostata e questa unione può essere espressa in modi diversi, è possibile esprimerla in modo che il pianificatore della query esegua senza eseguire la scansione di tutti i nodi e invece inizi con un NodeByLabelScan
per etichetta.
MATCH (n:Male)
WHERE n.name =~ '.ail.'
RETURN n
UNION MATCH (n:Female)
WHERE n.name =~ '.ail.'
RETURN n
Ciò significa esprimere la query una volta per ogni etichetta e unendoli con un esplicito UNION
. Questo non è irragionevole, almeno per un numero minore di etichette, ma non mi è chiaro il motivo per cui i pianificatori di query non dovrebbero essere in grado di dedurre la stessa implementazione dalla query più semplice, quindi ho aperto un problema github here.
MATCH n WHERE n:Label1 OR n:Label2
... genererà un AllNodesScan questa è una cattiva idea!
forse una soluzione migliore:
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)
Perché hai bisogno di "distinti" ad ogni passaggio? –
Grazie per aver segnalato "AllNodesScan", pensavo che ora sarebbe stato risolto. Ho aggiornato la mia risposta, avete qualche idea sulla mia alternativa più prolissa usando 'UNION' e come si confronta con il vostro' OPTIONAL MATCH'/'collect()'/'UNWIND'? – jjaderberg
Una nota: UNION è scomodo (e in alcuni casi inutilizzabile) perché attualmente (2.2) non è possibile eseguire alcuna elaborazione con i risultati di UNION. Ad esempio, non è possibile utilizzare SKIP/LIMIT o COUNT. –
documentazione per v3.0 dice questo:
si può anche descrivere un nodo che ha più etichette:
(a:User:Admin)-->(b)
Fonte: https://neo4j.com/docs/developer-manual/current/cypher/#_labels
La risposta non è corretta ma non è completamente negativa, penso che l'autore abbia mancato di includere la relazione nella query ma funziona allo scopo di associare più etichette di nodi: 'MATCH (a: Utente: Admin) - [ r] -> (b) restituisce a, r, b' – artemisian
FYI. L'URL di origine è leggermente cambiato. Questo è il nuovo: https://neo4j.com/docs/developer-manual/current/cypher/syntax/patterns/#_labels – Chad
In realtà, questo è sbagliato, (a: User: Admin) questa query descrive quando un nodo è un "utente e anche amministratore" Nessun utente o amministratore. –
- 1. Neo4j - Abbina più nodi usando gli ID
- 2. Neo4j unire 2 o più nodi duplicati
- 3. Classificazione documento con più etichette
- 4. R grep: abbina una stringa a più modelli
- 5. R - boxplot con più etichette di fattore
- 6. Etichette di spunta su più righe
- 7. Neo4j: il modo più veloce per trovare un nodo: dalla funzione id o dall'indice?
- 8. Trova nodi neo4j con più di una relazione in entrata
- 9. Qual è il più grande cluster Neo4j conosciuto?
- 10. collegamento di rete docker a 2 o più contenitori
- 11. Come sincronizzare un audio su 2 o più dispositivi ios
- 12. PyMongo crea un indice univoco con 2 o più campi
- 13. Come utilizzare 2 o più database con la molla?
- 14. Aggiunta di 2 o più oggetti a JFrame
- 15. Come implementare metodi identici con 2 o più classi?
- 16. Come combinare 2 o più gruppi C# in 1 libreria?
- 17. Magento - 2 o più osservatori sullo stesso evento
- 18. Doctrine 2 con più indici
- 19. più convertitori con retrofit 2
- 20. Eseguire più AVCaptureSessions o aggiungere più input
- 21. Funzioni di costo e attivazione per più etichette indipendenti
- 22. Mappe e raccolte nidificate in Neo4j 2
- 23. Come posso eseguire più database Neo4j su un singolo server?
- 24. Neo4j Multi-tenancy
- 25. pyplot combina più etichette di linea nella legenda
- 26. neo4j come restituire tutte le etichette dei nodi con Cypher?
- 27. Esclusi i nomi delle etichette nella semplice query di Neo4j
- 28. Più etichette di conversione di Google Adwords sulla stessa pagina
- 29. Il modo più appropriato per utilizzare Neo4j da Python nel 2015
- 30. Più moduli o più segnalazioni in una pagina?
C'è un modo più breve per farlo? Ad es. per le relazioni puoi specificare '(n) - [: rel1 | rel2] -> (m) 'dove' | 'indica' OR' –
No, non è possibile utilizzare un modello per le etichette e non sono a conoscenza di alcun altro modello che sia più corto o che funzioni senza una clausola 'WHERE'. Sentiti libero di inviare una richiesta di funzionalità al Neo4j [repository github] (https://github.com/neo4j/neo4j/issues). – jjaderberg
@Lyman Zerga ho anche cercato in molti posti ma non avendo nulla del genere –