Question

C'est une extension d'une autre SORTE (Neo4j 2.0 Fusion unique avec des contraintes de performance bug?), mais je vais essayer d'une autre façon.

MATCH (c:Contact),(a:Address), (ca:ContactAddress)
WITH c,a,collect(ca) as matrix
FOREACH (car in matrix | 
MERGE 
(c {ContactId:car.ContactId})
-[r:CONTACT_ADDRESS {ContactId:car.ContactId,AddressId:car.AddressId}]->
(a {AddressId:car.AddressId}))

Ceci conduit donc à un blocage de Neo4j serveur.Je suis d'essayer d'envelopper ma tête autour de pourquoi.
Mon processus de pensée derrière la requête est le suivant:

  • Je veux sélectionner toutes les coordonnées et Adresse des nœuds (ainsi que ContactAddress nœuds)
  • Je veux faire une boucle par tous les ContactAddress nœuds (qui contiennent les données de relation entre le Contact et l'Adresse) et le Contact et l'Adresse des nœuds les uns aux autres.

Lorsque j'exécute le code ci-dessus, le serveur se trouve à environ 40% de l'UC et de la mémoire continue de grimper.J'ai arrêté après le navigateur connecté déconnecté (monserveur:7474/navigateur), la réinitialisation de ma base de données et essayé à nouveau, cette fois en utilisant les éléments suivants:

match (c:Contact),(a:Address), (ca:ContactAddress)
WITH c,a,collect(distinct ca) as matrix
foreach (car in matrix | 
CREATE 
(c {ContactId:car.ContactId})
-[r:CONTACT_ADDRESS {ContactId:car.ContactId,AddressId:car.AddressId}]->
(a {AddressId:car.AddressId}))

Mêmes résultats.Enfermé, déconnecté base de données Neo4j alors que CPU reste chevillé et à l'utilisation de la RAM continue de grimper.Est-il une boucle ici que je ne suis pas voyant?

J'ai aussi essayé (avec le coup même):

FOREACH(row in {PassedInList} | 
    MERGE (c:Contact {ContactId:row.ContactId})
    MERGE (a:Address {AddressId:row.AddressId})
    MERGE (c)-[r:CONTACT_ADDRESS]->(a)
    )

RÉSOLU:

MATCH (ca:ContactAddress)
MATCH (c:Contact {ContactId:ca.ContactId}), (a:Address {AddressId:ca.AddressId})
MERGE p = (c)
          -[r:CONTACT_ADDRESS {ContactId:ca.ContactId,AddressId:ca.AddressId}]->
          (a)
Était-ce utile?

La solution

Lorsque vous écrivez match (c:Contact),(a:Address), (ca:ContactAddress), avec 3 déconnecté nœuds, puis Neo4j va correspondre à chaque produit cartésien de ces 3.Si vous aviez 100 de chaque type de nœud, c'est-à 100x100x100 = 1000000 résultats.

Essayez ceci:

MATCH (ca:ContactAddress), (c:Contact {ContactId:ca.ContactId}), (a:Address {AddressId:ca.AddressId})
MERGE (c)-[r:CONTACT_ADDRESS {ContactId:ca.ContactId,AddressId:ca.AddressId}]->(a)

Qui va correspondre à chaque :ContactAddress nœud, et seulement la :Contact et :Address les nœuds qui correspondent.Puis il va créer la relation (si elle n'existe pas déjà).

Si vous voulez être plus clair, vous pouvez également diviser la MATCH, c'est à dire:

MATCH (ca:ContactAddress)
MATCH (c:Contact {ContactId:ca.ContactId}), (a:Address {AddressId:ca.AddressId})
MERGE (c)-[r:CONTACT_ADDRESS {ContactId:ca.ContactId,AddressId:ca.AddressId}]->(a)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top