2017-01-24 4 views
0

У меня есть график, но вы должны быть уверены, что все узлы находятся в пути (но больше, чем эти узлы могут существовать в пути).Cypher Query Чтобы гарантировать, что все узлы находятся в пути, но могут существовать другие пути

Вот пример (извините, был черный некоторый материал):

Я хочу найти END2 и не END1, когда у меня есть значения одного и того же имущества во всех трех промежуточных узлов в списке Я проходил. Но я не могу получить запрос, который вернет end2 без end1. Там может быть больше узлов, которые имеют одни и те же маршруты, но я буду только каждый проход в разных значениях, которые не дублируются по средним узлам. Кто-нибудь знает запрос, который даст мне только конечный узел, который имеет все значения из промежуточных узлов? Существуют также узлы, которые висят от этих конечных узлов, а некоторые из них взаимосвязаны между end1 и end2. Некоторые другие не делают, и это те узлы, которых я не хочу, а потому, что есть путь между желтым и синим до конца1. Я не могу использовать ЛЮБОЙ, но поскольку там есть другие пути к тем же узлам (не изображены), я не могу используйте ВСЕ.

Заранее благодарим за помощь.

[Обновить] Вот текущий запрос, который я использую, но он допускает только один «конечный» узел для узла запуска, и я хочу несколько. Мне нужен этот id (eg) = {eg_id}, но он ограничивает его. Я бы предпочел использовать тот факт, что каждый а на пути ниже должен соответствовать списку свойств имени в среднем узле, должен быть там, чтобы добраться до того конечного узла. Так что если желтые и синие будут htere, тогда end1 и end2 вернутся, но если желтые, синие и фиолетовые будут там, то только end2 вернется.

start td = node({td_id}) 
match (td:Start)-[:Rel1]->(a)<-[:Rel2]-(eg:End)-[es:Rel3]->(n:WhatsPastEnd) 
with collect(a.name) as pnl, n, td, eg, es 
where id(eg) = {eg_id} 
and all(param_needs in {param_name_list} where param_needs in pnl) 
return n 
order by es.order 

[РЕШИТЬ]

Большое спасибо InverseFalcon, получил то, что мне нужно, используя решение!

+0

Можете ли вы отредактировать описание, чтобы предоставить запросы, которые вы пытались до сих пор? – InverseFalcon

+0

Кроме того, если вы можете предоставить метки узлов, а также дополнительную информацию о путях от начала до конца узлов, включая типы отношений, разрешенные для обхода между начальным и конечным узлами, и любую информацию о границах длины пути? – InverseFalcon

+0

обновлено описание, если кто-то может посмотреть –

ответ

0

Хорошо, давайте изменим ваш запрос и отменим сопоставление идентификатора endnode.

start td = node({td_id}) 
// unwind your list of names so every row has a name 
with td, {param_name_list} as param_names 
unwind param_names as param_name 
match (td:Start)-[:Rel1]->(a) 
where a.name = param_name 
// now a has all nodes with the required names 
// collect then unwind so we have the full collection for each a 
with collect(a) as requiredNodes 
unwind requiredNodes as a 
match (a)<-[:Rel2]-(eg:End) 
where all(node in requiredNodes where (node)<-[:Rel2]-(eg)) 
with eg 
match (eg)-[es:Rel3]->(n:WhatsPastEnd) 
return n 
order by es.order 
Смежные вопросы