neo4j:opcional "passos" em Cypher consulta
Pergunta
Eu estou tentando encontrar relações entre nós com opcional, mas nós específicos/relações entre (neo4j 2.0 M6).
Em meu modelo de dados, o 'Gene' pode ser 'PARTOF" a " do Grupo.Eu tenho 'INTERAGIR' relações entre o 'Gene'-'Gene', 'Gene'-'Grupo' e 'Grupo'-'Grupo' (linhas vermelhas na imagem do modelo).
Eu quero ferver, diminua para todos 'INTERAGIR' relações entre o 'Gene':direto (Gene-INTERACT-Gene)
e através de um ou dois 'Grupo' (Gene-PARTOF-Group-INTERACT-Gene)
.
É claro que isso é fácil com vários Cypher consultas:
# direct INTERACT
MATCH (g1:Gene)-[r:INTERACT]-(g2:Gene) RETURN g1, g2
# INTERACT via one Group
MATCH (g1:Gene)-[:PARTOF]-(gr:Group)-[r:INTERACT]-(g2:Gene) RETURN g1, g2
# INTERACT via two Group
MATCH (g1:Gene)-[:PARTOF]-(gr1:Group)-[r:INTERACT]-(gr2:Group)-[:PARTOF]-(g2:Gene)
RETURN g1, g2
Mas seria possível construir uma única Cypher consulta que leva opcional Grupo 'passos' no caminho?Até agora eu só usei opcional relações e shortestPaths
, mas eu não tenho idéia se eu pode filtrar por um ou dois nós opcionais entre os dois genes.
Solução
Você pode atribuir uma profundidade entre zero e um para cada um dos relacionamentos que você adicionar o caminho.Tente algo como
MATCH (g1:Gene)-[:PARTOF*0..1]-(gr1)-[:INTERACT]-(gr2)-[:PARTOF*0..1]-(g2:Gene)
RETURN g1,g2
e para ver de que a correspondência caminhos aspecto, basta retornar o caminho inteiro
MATCH p=(g1:Gene)-[:PARTOF*0..1]-(gr1)-[:INTERACT]-(gr2)-[:PARTOF*0..1]-(g2:Gene)
RETURN p
Há um pouco de se preocupar com a declarar nó de rótulos para as partes opcionais a este padrão, no entanto, para que esta consulta pressupõe que os genes não são parte de qualquer outro de grupos, e que eles só interagem com grupos e outros genes.Se um gene pode ter [:PARTOF]
outra coisa, em seguida, (gr1)
vai vincular a algo, e a consulta não é mais confiável.Simplesmente adicionando uma cláusula where, como
WHERE gr1:Group AND gr2:Group
exclui-se o caso em que as partes opcionais não são correspondidos, de modo que não funcionam (seria como a sua terceira consulta).Tenho certeza de que pode ser resolvido, mas se o seu modelo real não é muito mais complexo do que o que você descreve a sua pergunta, isso deve.
Tomei a liberdade de interpretar o seu modelo em um console aqui, confira para ver se ele faz o que você quer.