2015-10-29 7 views
1

У меня есть подграф в Neo4j с несколькими путями, сгенерированных с помощью:Кортеж ближайших соседей в подграфа в Neo4j

match p=((n:Actor)-[*1..3]->(m:film)) where n.surname='Craig' and m.name='Minions' and ALL(x in nodes(p)[1..length(p)-1] where labels(x)[0]='Director') return p 

Теперь из этого подграфа Я хочу, чтобы список кортежей, где каждый кортеж представляет собой пару подключенных узлов в подграфа:

node0, node1 
node1, node3 
node0, node2 
node2, node26 

Я пробовал:

match p=((n:Actor)-[*1..3]->(m:film)) 
where n.surname='Craig' and m.name='Minions' and ALL(x in nodes(p)[1..length(p)-1] where labels(x)[0]='Director') 
with nodes(p) as np 
match p2=((nn)-[]-()) where nn IN np 
return p2 

, но это только что вернулся ближайшего соседа каждого узла в p. В том числе до узлов не в подграфе.

Это похоже на работу

MATCH p=((n:Actor)-[*1..3]->(m:Film)) 
WHERE n.surname='Craig' AND m.name='minions' AND ALL(x in nodes(p)[1..length(p)-1] WHERE labels(x)[0]='Director') 
MATCH p2=(n2)-[r]-(m2) 
WHERE n2 IN nodes(p) AND m2 IN nodes(p) 
RETURN 
n2,r,m2 

Однако очень медленно, любая скорость рекомендаций?

+0

Вы не указали 'с p' между вашими предложениями о матче? –

ответ

1

Вместо того, чтобы брать все данные с путей и пересортировать их против графика, вы можете обрабатывать пути для пар в памяти. Если вы берете узлы из каждого пути и обрабатываете их по два раза, вы можете их собрать в упорядоченных парах.

... 
// for each path grab the nodes 
// and an index for them less the last one 
// 
with nodes(p) as node_list, range(0, size(nodes(p)) - 2, 1) as idx 
// 
// put the tuples in ordered pairs 
// 
unwind idx as i 
with node_list[i] as a , node_list[i+1] as b 
with 
    case 
    when id(a) < id(b) then [id(a), id(b)] 
    else [id(b), id(a)] 
    end as tuple 
return tuple, count(*) 
order by count(*) desc 
+0

OMG! блестящий, супер быстрый, спасибо! – laila

Смежные вопросы