2017-01-27 4 views
0

Я открыл здесь этот вопрос: How to find specific subgraph in Neo4j using where clause, чтобы найти путь к определенным критериям. Но когда я пытаюсь делать такие вещи, как получить тип отношений, я не могу.Как перечислять узлы и отношения вдоль пути, возвращаемого через Cypher

Например, я попытался MATCH p = (n:Root)-[rs1*]->() WHERE ALL(rel in rs1 WHERE rel.relevance is null) RETURN nodes(p), TYPE(relationships(p))

Но я получаю ошибку:

Type mismatch: expected Relationship but was Collection<Relationship> 

Я думаю, что мне нужно использовать пункт WITH, но не уверен.

Аналогичным образом мне нужен идентификатор узла, но это также не удалось.

ответ

1

Проблема заключается в том, что relationships возвращает коллекцию, а функция type работает только с одной связью. Существует два основных подхода к решению этой проблемы.

Используйте UNWIND, чтобы получить отдельную строку для каждого отношения:

MATCH p = (n:Root)-[rs1*]->() 
WHERE ALL(rel in rs1 WHERE rel.relevance is null) 
WITH relationships(p) AS rs 
UNWIND n, rs AS r 
RETURN n, type(r) 

Используйте extract, чтобы получить результаты в виде списка (в одной строке на корневой узел):

MATCH p = (n:Root)-[rs1*]->() 
WHERE ALL(rel in rs1 WHERE rel.relevance is null) 
WITH n, relationships(p) AS rs 
RETURN n, extract(r IN rs | type(r)) 

Или даже краткое описание:

MATCH p = (n:Root)-[rs1*]->() 
WHERE ALL(rel in rs1 WHERE rel.relevance is null) 
RETURN n, extract(r IN relationships(p) | type(r)) 
Смежные вопросы