Domanda

Sto cercando di trovare relazioni tra i nodi con nodi / relazioni opzionali ma specifici in mezzo (NEO4J 2,0 M6).

Nel mio modello di dati, il "Gene" può essere 'parte' 'un gruppo'.Ho "interagire" le relazioni tra "Gene" - "Gene", "Gene" - "Gruppo" e "Gruppo" - "Gruppo" (linee rosse nell'immagine del modello).

Voglio far bollire ciò a tutte le relazioni "Interact" tra "Gene": sia (Gene-INTERACT-Gene) diretto che tramite uno o due "Gruppo" (Gene-PARTOF-Group-INTERACT-Gene).


.

Inserire l'immagine Descrizione qui


.

certo che questo è facile con più query di circulsore:

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

Ma sarebbe possibile costruire una singola query di Cypher che richiede opzionali "Passi di gruppo" nel percorso?Finora ho usato solo relazioni opzionali e shortestPaths, ma non ho idea se posso filtrare per uno o due nodi opzionali tra due geni.

È stato utile?

Soluzione

È possibile assegnare una profondità tra zero e uno per ciascuna delle relazioni aggiunte al percorso. Prova qualcosa come

MATCH (g1:Gene)-[:PARTOF*0..1]-(gr1)-[:INTERACT]-(gr2)-[:PARTOF*0..1]-(g2:Gene) 
RETURN g1,g2
.

E per vedere cosa assomigliano i percorsi abbinati, basta restituire l'intero percorso

MATCH p=(g1:Gene)-[:PARTOF*0..1]-(gr1)-[:INTERACT]-(gr2)-[:PARTOF*0..1]-(g2:Gene) 
RETURN p
.

C'è un po 'di disturbo con la dichiarazione di etichette del nodo per le parti opzionali di questo schema, tuttavia, quindi questa query presuppone che i geni non facciano parte di nulla di diverso dai gruppi e che interagiscono solo con gruppi e altri geni. Se un gene può avere [:PARTOF] a qualcos'altro, allora (gr1) si legellerà che qualcosa e la query non è più affidabile. Basta aggiungere una clausola dove

WHERE gr1:Group AND gr2:Group
.

Escludisce il caso in cui le parti opzionali non sono abbinate, in modo che non funzionerà (sarebbe come la tua terza query). Sono sicuro che può essere risolto ma se il tuo modello reale non è molto più complesso di quello che descrivi nella tua domanda, questo dovrebbe.

Ho preso la libertà di interpretare il tuo modello in una console qui , controllalo per vedere Se fa quello che vuoi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top