2016-07-01 3 views
0

у меня есть два графика построены так:Neo4j: Cypher запрос возвращает повторяющиеся результаты

CREATE (level1a:Bug {name: 'a'}) 
CREATE (level1b:Bug {name: 'b'}) 
CREATE (level2c:Bug {name: 'c'}) 
CREATE (level2d:Bug {name: 'd'}) 
CREATE (level3e:Bug {name: 'e'}) 
CREATE (level3f:Bug {name: 'f'}) 
CREATE (level3g:Bug {name: 'g'}) 
CREATE (level3h:Bug {name: 'h'}) 

CREATE (level1a)-[:LINK]->(level2c) 
CREATE (level1b)-[:LINK]->(level2d) 
CREATE (level2c)-[:LINK]->(level3e) 
CREATE (level2c)-[:LINK]->(level3f) 
CREATE (level2d)-[:LINK]->(level3g) 
CREATE (level2d)-[:LINK]->(level3h) 

А также можно посмотреть здесь: http://console.neo4j.org/?id=duplicate_bug2

Когда я выполнить запрос:

MATCH (a:Bug {name: 'a'})-[:LINK]->()-[:LINK]->(end) return end 

Я получаю ожидаемые два узла (f и e). Но если я делаю два совпадающих запроса, например:

MATCH (a:Bug {name: 'a'})-[:LINK]->()-[:LINK]->(end) 
MATCH (b:Bug {name: 'b'})-[:LINK]->()-[:LINK]->(end2) 
return end, end2 

Я получаю дубликаты узлов в конце и в конце2. Почему это? Два графика не связаны даже!

BR, S

ответ

0

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

Я думаю, что вы находитесь за чем-то вроде этого запроса. Он находит все концы от первого совпадения, объединяет их в коллекцию и затем повторяет процесс для второго совпадения. Затем он возвращает одну строку в результирующем наборе со всеми концами a и всеми концами b независимо от того, сколько их в конце каждого совпадения.

MATCH (a:Bug {name: 'a'})-[:LINK]->()-[:LINK]->(end) 
with collect(end) as end 
MATCH (b:Bug {name: 'b'})-[:LINK]->()-[:LINK]->(end2) 
return end, collect(end2) as end2 
+0

Куда можно комбинировать результирующий набор? Даже если я вернусь только к концу, он все равно будет содержать дубликаты. – sgadrian

+0

Для каждого результата в первом матче выполняется второе совпадение. Поскольку две строки выполняются дважды. Поскольку второе совпадение также создает две строки, конечным результатом является четыре строки. Я согласен, что язык в оригинальном ответе неуклюжим, поэтому я его изменил. –

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