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).


enter image description here


É 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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top