2013-12-19 3 views
3

Как я могу вернуть узлы и отношения чередующиеся? Использование базы данных Матрица фильм запросneo4j cypher interleave узлы и отношения

MATCH p=(a1:Actor {name:"Keanu Reeves"})-[r *0..5]-(a2:Actor {name: "Carrie-Anne Moss"}) 
    return [n in nodes(p)|coalesce(n.title,n.name)], [rel in relationships(p)|type(rel)] 

возвращает две колонки, одна с узлами и один с отношениями

Keanu Reeves, The Matrix, Laurence Fishburne, The Matrix Reloaded, Carrie-Anne Moss | ACTS_IN, ACTS_IN, ACTS_IN, ACTS_IN 
    ... 

, но я хочу

Keanu Reeves, ACTS_IN, The Matrix, ACTS_IN, Laurence Fishburne, ACTS_IN, The Matrix Reloaded, ACTS_IN, Carrie-Anne Moss 
    ... 

ответ

1

Это обыкновение быть проще, но они сломали «простой способ» в 2.0-RC1, когда они больше не собирали «Контуры», в Cypher.

match p= shortestPath((kevin)-[:ACTED_IN*]-(charlize)) 
where kevin.name="Kevin Bacon" 
and charlize.name="Charlize Theron" 
with nodes(p) as ns, rels(p) as rs, range(0,length(nodes(p))+length(rels(p))-1) as idx 
return [i in idx | case i % 2 = 0 when true then coalesce((ns[i/2]).name, (ns[i/2]).title) else type(rs[i/2]) end]; 

старый путь был:

match p= shortestPath((kevin)-[:ACTED_IN*]-(charlize)) 
where kevin.name="Kevin Bacon" 
and charlize.name="Charlize Theron" 
return [x in p | coalesce(x.name,x.title, type(x))] 

Преимущество изменения в том, что Дорожки более типа в безопасности, хотя он принял справедливое немного убедительна для меня, чтобы согласиться с ними. Реальный прецедент для такого типа запросов между ними невелик.

+0

Спасибо. Я не знал, что это изменилось (я только пробовал это в версии 2), но второе решение казалось мне очевидным (и не работало), что p будет сборкой. – user3114859

1

Вот еще одно решение:

MATCH (kevin:Person {name="Kevin Bacon"}), (charlize:Person {name:"Charlize Theron"}) 
MATCH p= shortestPath((kevin)-[:ACTED_IN*]-(charlize)) 

WITH nodes(p)+rels(p) AS c, length(p) AS l 
RETURN reduce(r=[], x IN range(0,l) | r + (c[x]).name + type(c[l+x+1])) 

Какие повторно агрегирует путь в коллекцию, а затем просто использует путь длины, как смещение для доступа ко второй половине.

Уменьшение используется для «сглаживания» коллекции, если вам это не нужно, это также работает.

MATCH (kevin:Person {name="Kevin Bacon"}), (charlize:Person {name:"Charlize Theron"}) 
MATCH p= shortestPath((kevin)-[:ACTED_IN*]-(charlize)) 

WITH nodes(p)+rels(p) AS c, length(p) AS l 
RETURN [x IN range(0,l) | [c[x]).name + type(c[l+x+1])]] 
+0

+1, мне это нравится. :) –

+0

Очень приятно. Изучив Clojure, функция сокращения была моей второй догадкой, но я не мог понять, как объединить узлы и коллекцию отношений. Теперь я понимаю немного больше, как работает Neo4j. – user3114859

+0

Зачем вам нужно писать (c [x]). Name и почему не работает c [x] .name? Я не нашел примера этого в руководстве (искал «])». в текстовой версии). – user3114859

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