2016-03-02 2 views
0

J'ai un graphique avec environ 800k nœuds et je veux créer des relations aléatoires entre eux, en utilisant Cypher.Créer des relations dans Neo4j

Des exemples comme celui-ci ne fonctionnent pas parce que le produit cartésien est trop grand:

match (u),(p) 
with u,p 
create (u)-[:LINKS]->(p); 

Par exemple, je veux 1 relation pour chaque noeud (800k) ou 10 relations pour chaque noeud (8M).

En bref, j'ai besoin d'une requête Cypher afin de créer UNIFORMLY entre les nœuds. Est-ce que quelqu'un connaît la requête pour créer des relations de cette manière?

+1

Copie possible de [Écrire une requête Cypher pour créer des liens entre des nœuds aléatoires] (http://stackoverflow.com/questions/32621407/write-a-cypher-query-to-create-links-between-random-nodes – cybersam

+0

Non, la solution proposée retombe dans l'exemple non fonctionnel que j'ai écrit dans ma question. –

Répondre

0

Vous voulez donc que chaque nœud ait exactement x relations? Essayez ceci dans des lots jusqu'à ce qu'aucune relations sont mises à jour:

MATCH (u),(p) WHERE size((u)-[:LINKS]->(p)) < {x} 
WITH u,p LIMIT 10000 WHERE rand() < 0.2 // LIMIT to 10000 then sample 
CREATE (u)-[:LINKS]->(p) 
+0

Pourquoi limitez-vous, p à 10000 si les nœuds sont 800k? et pourquoi échantillonnez-vous avec rand() à 20%? –

+0

Cela ne fonctionne pas car cela crée beaucoup de relations pour chaque nœud. –

0

Cela devrait fonctionner (en supposant que votre serveur Neo4j a assez de mémoire):

MATCH (n) 
WITH COLLECT(n) AS ns, COUNT(n) AS len 
FOREACH (i IN RANGE(1, {numLinks}) | 
    FOREACH (x IN ns | 
    FOREACH(y IN [ns[TOINT(RAND()*len)]] | 
     CREATE (x)-[:LINK]->(y)))); 

Cette requête rassemble tous les nœuds, et utilise des boucles imbriquées pour faire {numLinks} fois: créer une relation LINK entre chaque nœud et un nœud choisi au hasard. Le FOREACH le plus à l'intérieur est utilisé comme une solution de contournement pour la limitation de chiffrement actuelle que vous ne pouvez pas mettre une opération qui renvoie un nœud à l'intérieur d'un modèle de nœud. Pour être précis, c'est illégal: CREATE (x)-[:LINK]->(ns[TOINT(RAND()*len)]).