2017-10-19 10 views
0

J'essaie de créer des arêtes entre des nœuds qui partagent des propriétés dans neo4j. Chaque noeud a 5 propriétés, disons a, b, c, d, e. Si 2 nœuds partagent uniquement la propriété 'a', alors le bord aura le nom 'a'. Si 2 nœuds partagent les propriétés b, d, e, alors le nom de bord sera 'bde'. Pour chaque paire, si elles partagent des propriétés, je veux créer un seul bord. Merci.Comment créer un bord conditionnel entre les nœuds dans neo4j?

+0

Il y a quelques informations qui pourraient aider à répondre à votre question. 1. Par le nom du bord, voulez-vous dire le 'type' du bord? 2. Si oui, pouvez-vous utiliser la [bibliothèque APOC] (https://neo4j-contrib.github.io/neo4j-apoc-procedures/)? –

Répondre

2

Cette requête devrait créer une relation FOO avec le name d'une propriété qui a la même valeur entre chaque paire de noeuds (qui partagent les valeurs de propriété):

MATCH (m), (n) 
WHERE ID(m) < ID(n) 
WITH m, n, [x IN KEYS(m) WHERE m[x] = n[x] | x] AS common_keys 
FOREACH (k IN common_keys | CREATE (m)-[:FOO {name: k}]->(m)) 

La clause WHERE ID(m) < ID(n) empêche m et n de étant le même noeud, et empêche également l'évaluation en double de la même paire.

[UPDATE]

Si vous voulez une seule relation FOO entre 2 nœuds, même si elles partagent des valeurs de propriété multiples, cette requête devrait fonctionner:

MATCH (m), (n) 
WHERE ID(m) < ID(n) 
WITH m, n, 
    REDUCE(s = '', k IN KEYS(m) | CASE m[k] WHEN n[k] THEN s + k ELSE s END) AS common_keys 
WHERE common_keys <> '' 
CREATE (m)-[:FOO {name: common_keys}]->(m) 
+0

Merci. Votre requête crée plusieurs bords. J'ai donc fait un changement pour créer un seul bord avec des noms comme 'ade'. – Neo

+0

Merci pour la mise à jour @ cybersam. Existe-t-il un moyen plus efficace pour un grand ensemble de données. Merci! – Neo

+0

Cette requête produit un produit cartésien et la taille de mes données est très grande (~ 1million). existe-t-il un moyen plus efficace de créer des bords. Merci! – Neo