Question

Je suis en train d'essayer de trouver des relations entre les nœuds avec, en option, mais certains nœuds et les relations entre les deux (neo4j 2.0 de M6).

Dans mon modèle de données, 'Gene' peut être 'SOCIÉTÉ' a 'Groupe.J'ai des "INTERAGIR" les relations entre les 'Gene'-'Gene', 'Gene'-'Groupe' et 'Groupe'-'Groupe' (lignes rouges dans l'image du modèle).

Je veux faire bouillir de tous "INTERAGIR" les relations entre les 'Gene':à la fois direct (Gene-INTERACT-Gene) et par un ou deux Groupe (Gene-PARTOF-Group-INTERACT-Gene).


enter image description here


Bien sûr, c'est facile avec de multiples Monogramme de requêtes:

# 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

Mais serait-il possible de construire un seul Chiffre requête en option Groupe d'étapes " dans le chemin d'accès?Jusqu'à présent je n'ai utilisé en option relations et shortestPaths, mais je n'ai aucune idée si je peux filtre en option une ou deux nœuds entre les deux gènes.

Était-ce utile?

La solution

Vous pouvez attribuer une profondeur comprise entre zéro et un pour chacune des relations que vous ajouter le chemin d'accès.Essayez quelque chose comme

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

et pour voir ce que les paires de chemins ressemblent effectivement, il suffit de retourner le chemin d'accès complet

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

Il y a un peu de la peine de déclarer nœud d'étiquette pour les pièces en option de ce modèle, cependant, de sorte que cette question suppose que les gènes ne font pas partie de rien d'autre que des groupes, et qu'ils interagissent seulement avec des groupes et d'autres gènes.Si un gène peut avoir [:PARTOF] pour quelque chose d'autre, alors (gr1) lie, que quelque chose, et que la requête n'est plus fiable.Simplement en ajoutant une clause where comme

WHERE gr1:Group AND gr2:Group

exclut les cas où les parties optionnelles ne sont pas appariés, donc qui ne fonctionne pas (ce serait comme votre troisième requête).Je suis sûr qu'il peut être résolu, mais si votre modèle n'est pas beaucoup plus complexe que ce que vous décrivez dans votre question, cela devrait.

J'ai pris la liberté d'interpréter votre modèle dans une console ici, vérifier pour voir si il fait ce que vous voulez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top