2014-11-17 4 views
1

Я расширяю превосходный пример визуализации графа (http://maxdemarzi.com/2013/07/03/the-last-mile/) с помощью VivaGraph под поддержкой neo4j.neo4j сбор узлов и связей тип b -> a <- c, a <- d

Я хочу, чтобы отобразить отношения типа

a-->b<--c,b<--d 

Я попробовал запрос

MATCH p = (a)--(b:X)--(c),(b:X)--(d) 
RETURN EXTRACT(n in nodes(p) | {id:ID(n), name:COALESCE(n.name, n.title, ID(n)), type:LABELS(n)}) AS nodes, 
EXTRACT(r in relationships(p)| {source:ID(startNode(r)) , target:ID(endNode(r))}) AS rels 

Похоже, именованный запрос подбирает только a-->b<--c шаблон и опускает b<--d узоры.

Мне что-то не хватает ... Могу ли я добавить несколько шаблонов в именованный запрос?

+0

Пожалуйста, поделитесь своими результатами, когда вы закончите! –

+0

@MichaelHunger уверен. – lambogambo

ответ

3

Самая непосредственная проблема в том, что запятая в предложении MATCH отделяет первый шаблон от второго. Переменная «p» сохраняет только первый шаблон. Вот почему вы не получаете желаемых результатов. Независимо от этого, вы рискуете иметь «свободное связывание», поместив метку на оба ваших узла с именем «b» в двух шаблонах. Второй узел «b» не должен иметь метки.

Итак, вот версия вашего запроса, которая должна работать.

MATCH p1=(a)-->(b:X)<--(c), p2=(b)<--(d) 
WITH nodes(p1) + d AS ns, relationships(p1) + relationships(p2) AS rs 
RETURN EXTRACT(n IN ns | {id:ID(n), name:COALESCE(n.name, n.title, ID(n)), type:LABELS(n)}) AS nodes, 
     EXTRACT(r in rs| {source:ID(startNode(r)) , target:ID(endNode(r))}) AS rels 

Захватите оба пути, затем создайте коллекции из узлов и отношения обоих путей. Коллекция узлов фактически извлекает только узлы из p1 и добавляет узел 'd'. Вы можете написать эту деталь как

nodes(p1) + nodes(p2) as ns 

но тогда узел 'b' появится в списке дважды.

+0

У меня был очень похожий ответ :). И я также думаю, что второй путь не обязательно необходим, поскольку только одно отношение может быть добавлено к другим, например: '... b <- [r_d] -d ... rels (p) + r_d'. Это также было бы более симметричным. – zaboco

+0

@zaboco вы можете уточнить свой ответ? Как бы вы добавили (a) -> (b: X) <- (c), (b) <- (d) в один? (без добавления запятой) – lambogambo

+0

@ Захар жаль, я думаю, я недостаточно объяснил себя достаточно: я не имел в виду, что два пути можно было добавить в один, я просто сказал, что я буду менять 'p2 = (b) < - (d) 'в' (b) <- [r_d] - (d) 'и' отношения (p1) + отношения (p2) 'в' отношения (p1) + r_d'. Это потому, что 'отношения (p2)' равнозначны '[r_d]' (p2 - путь с одной связью) – zaboco

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