2016-03-02 9 views
0

У меня есть график с около 800k узлов, и я хочу создать случайные отношения между ними, используя Cypher.Создать отношения в Neo4j

Примеров, подобные следующему не работают, потому что декартово произведение является слишком большим:

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

Например, я хочу 1 соотношение для каждого узла (800k), или 10 связей для каждого узла (оГО).

Короче, мне нужен запрос Cypher, чтобы UNIFORMLY создавал отношения между узлами. Кто-нибудь знает запрос для создания отношений таким образом?

+1

Возможный дубликат [Напишите запрос Cypher для СОЗДАНИЯ ссылок между случайными узлами] (http://stackoverflow.com/questions/32621407/write-a-cypher-query-to-create-links-between-random-nodes) – cybersam

+0

Нет, предлагаемое решение возвращается в нерабочий пример, который я написал в моем вопросе. –

ответ

0

Итак, вы хотите, чтобы каждый узел имел ровно x отношений? Попробуйте это в пакетном режиме, пока не больше отношения не будут обновлены:

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

Почему вы LIMIT u, p до 10000, если узлы 800k? и почему вы пробуете с rand() на 20%? –

+0

Он не работает, потому что он создает много отношений для каждого узла. –

0

Это должно работать (предполагается, что ваш сервер Neo4j достаточно памяти):

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)))); 

Этот запрос собирает все узлы, и использует вложенные циклы, чтобы сделать следующие {numLinks} раз: создать связь LINK между каждым узлом и случайно выбранным узлом.

Внутренний FOREACH используется в качестве обходного пути для текущего ограничения Cypher, которое невозможно поместить операцию, которая возвращает узел внутри шаблона узла. Чтобы быть конкретным, это незаконно: CREATE (x)-[:LINK]->(ns[TOINT(RAND()*len)]).