neo4j: извлечение случайных графов

У нас есть большая база данных графов, созданная с помощью Neo4j, которая имеет два типа отношений "E" и "I".
Мы хотели бы извлечь из нее два графа с начальным узлом с именем n0. Первый граф Gxi, основанный на отношении "I", должен быть получен случайным образом. Следующий запрос неверен, но это идея, которую мы хотим реализовать. Здесь для каждого узла последнего шага случайным образом выбираются 10 соседей.

MATCH r1:(n0)-[:I]-(n1)
WITH random(n1) LIMIT 10
MATCH r2:(n1)-[:I]-(n2)
WITH random(n2) LIMIT 10*10
MATCH r3:(n2)-[:I]-(n3)
WITH random(n3) LIMIT 10*10*10
MATCH r4:(n4)-[:I]-(n4)
WITH random(n4) LIMIT 10*10*10*10
RETURN r1+r2+r3+r4

Затем мы хотели бы создать второй граф Gxe на основе отношений "E" и узлов Gxi.

Спасибо за помощь.


person Pascal KREZEL    schedule 08.12.2017    source источник


Ответы (1)


Здесь могут помочь процедуры APOC. Существуют функции коллекции, которые можно использовать для выбора случайных элементов из коллекции, и вы можете получить фрагменты коллекции, а не использовать LIMIT.

Более сложной частью будет сбор подпутей по пути.

// assume already matched to start node n
MATCH r = (n)-[:I]-()
WITH apoc.coll.randomItems(collect(r), 10) as r1
UNWIND r1 as r
WITH r1, last(nodes(r)) as n

MATCH r = (n)-[:I]-()
WITH r1, apoc.coll.randomItems(collect(r), 10) as r2
UNWIND r2 as r
WITH r1, r2, last(nodes(r)) as n

MATCH r = (n)-[:I]-()
WITH r1, r2, apoc.coll.randomItems(collect(r), 10) as r3
UNWIND r3 as r
WITH r1, r2, r3, last(nodes(r)) as n

MATCH r = (n)-[:I]-()
WITH r1, r2, r3, apoc.coll.randomItems(collect(r), 10) as r4
RETURN r1 + r2 + r3 + r4
person InverseFalcon    schedule 08.12.2017
comment
Большое спасибо за этот ответ, который работает очень хорошо! - person Pascal KREZEL; 08.12.2017