No Neo4j, preciso encontrar todos os relacionamentos com um determinado valor de propriedade, independentemente do tipo de relacionamento:
WITH ["1651365", "1188654", "1151147", ...] AS relIds
MATCH ()-[r]->() WHERE r.myId IN relIds
RETURN TYPE(r) AS type, properties ( r ) AS props;
Esta consulta funciona, mas é muito lenta. Se eu criar um perfil, vejo que é baseado em uma varredura completa (de 14 milhões de relacionamentos).
O problema é que não há como definir um índice para todos os tipos de relacionamento (posso fazer o mesmo com uma lista de tipos e o mecanismo usará índices definidos para myId
).
Há uma solução? Ao usar o elementId()
, o mecanismo faz uma operação de busca e é muito rápido, mas a documentação desencoraja (dizem que os IDs internos são reutilizados após a exclusão).
Você pode criar um índice de texto completo em propriedades de vários tipos de relacionamento. Por exemplo:
Com esse índice, você pode fazer uma pesquisa de texto completo:
Aceitei a resposta do cybersam , pois é uma boa para o caso geral (ao adicionar o comentário sobre como gerar a lista de tipos de relação).
Estou pensando em outra abordagem:
Eu obtenho os relIds de uma consulta anterior, que também poderia obter tipos de relação, e então o último poderia ser usado para construir uma lista de '|' tipos separados para serem passados para minha consulta original.
Dessa forma, a consulta se torna eficiente (
myId
possui um índice para cada tipo e o Neo4j utiliza).