Как получить тип ребра между связанными узлами, используя запрос шифра - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь получить матрицу смежности из графика neo4j.Эта матрица содержит богатые возможности.Это означает, что если два узла соединены, то поместите тип узла (тип является полем узла) и тип ребра в соответствующую ячейку.Это пример матрицы:

[
   [0, 'node_1_type : edge_type : node_2_type', 0],
   ...
]

Это запрос шифра, который я собираюсь попробовать.Но я не знаю, как получить edge_type подключенных узлов.

MATCH (n)
WITH collect(n) AS Nodes
WITH [n IN Nodes |
        [m IN Nodes |
            CASE size((n)-[]->(m))
                WHEN 0 THEN 0
                ELSE n.type + ':' + 'edge-type ??'  +  ':' + m.type
            END
        ]
    ] AS AdjacencyMatrix
RETURN AdjacencyMatrix;

Не могли бы вы помочь, как получить тип ребра между подключенными узлами.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

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

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]), так вот как это работает, в том порядке, в котором оно оценивается (часть оценивается жирным шрифтом)

  1. (а) -> (б) | Первое совпадение с шаблоном (a) -> (b) (результат - список )
  2. (а) -> (б) [0] | Возьмите первый результат из списка (Result is Path)
  3. ОТНОШЕНИЯ ( (a) -> (b) [0] ) | Извлечение отношений из пути (список результатов )
  4. ОТНОШЕНИЯ ((a) -> (b) [0]) [0] | Возьмите первый результат из этого списка (Result is Relationship)
  5. ТИП ( ОТНОШЕНИЯ ((a) -> (b) [0]) [0] ) | Возьмите тип этой Отношения (Результатом является Строка)
0 голосов
/ 14 сентября 2018

Поскольку вы не можете получить именованный результат внутри CASE, используйте UNWIND:

MATCH (n)
WITH collect(n) AS Nodes
UNWIND Nodes AS n
  UNWIND Nodes AS m
  OPTIONAL MATCH (n)-[r]->(m)
  WITH n, m, 
    CASE r 
      WHEN NULL THEN 0 
      ELSE n.type + ':' + type(r) + ':' + m.type
    END AS e
  WITH m, collect(e) AS row
WITH collect(row) AS AdjacencyMatrix
RETURN AdjacencyMatrix;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...