Поскольку матрица смежности почти по определению является декартовым произведением, я бы порекомендовал сделать это прямым путем. Поскольку конечным результатом является декартово произведение, в этом случае избегать его не имеет смысла.
MATCH (a), (b) OPTIONAL MATCH (a)-[r]->(b)
WITH a,b,
CASE r
WHEN null THEN 0
ELSE a.type+":"+TYPE(r)+":"+b.type
END as edge
// collect rows into matrix
return a, edge, b
С другой стороны, если по какой-то причине вы настаиваете на том, чтобы сделать это трудным способом, вы можете использовать сопоставление с шаблоном для извлечения информации (хотя и гораздо менее эффективно, поскольку вы заставляете Neo4j без необходимости сопоставлять все много раз)
MATCH (a), (b)
WITH a,b,
CASE SIZE((a)-->(b))
WHEN 1 THEN a.type+":"+TYPE(RELATIONSHIPS((a)-->(b)[0])[0])+":"+b.type
ELSE 0
END as edge
// collect rows into matrix
return a, edge, b
С магией здесь, очевидно, является TYPE(RELATIONSHIPS((a)-->(b)[0])[0])
, так вот как это работает, в том порядке, в котором оно оценивается (часть оценивается жирным шрифтом)
- (а) -> (б) | Первое совпадение с шаблоном (a) -> (b) (результат - список )
- (а) -> (б) [0] | Возьмите первый результат из списка (Result is Path)
- ОТНОШЕНИЯ ( (a) -> (b) [0] ) | Извлечение отношений из пути (список результатов )
- ОТНОШЕНИЯ ((a) -> (b) [0]) [0] | Возьмите первый результат из этого списка (Result is Relationship)
- ТИП ( ОТНОШЕНИЯ ((a) -> (b) [0]) [0] ) | Возьмите тип этой Отношения (Результатом является Строка)