Pergunta

Eu tenho uma consulta como esta:

MATCH left, right 
WHERE (ID(right) IN [1, 2, 3] AND ID(left) IN [4, 5, 6]) 
WITH left, right 
  LIMIT 1 
RETURN left, right 
UNION MATCH left, right 
WHERE (ID(right) IN [1, 2, 3] AND ID(left) IN [4, 5, 6]) 
WITH left, right 
  SKIP 4 LIMIT 1 
RETURN left, right 
UNION MATCH left, right 
WHERE (ID(right) IN [1, 2, 3] AND ID(left) IN [4, 5, 6]) 
WITH left, right 
  SKIP 8 LIMIT 1 
RETURN left, right
CREATE UNIQUE left-[rel:FRIEND]->right 
RETURN rel;

No geral, estou apenas criando um conjunto de dados para que eu possa usá-lo mais tarde em CRIAR ÚNICA instrução.
Obviamente, isso não funciona - query analyzer diz que eu só posso usar cláusula de RETORNO de uma vez.A minha pergunta é - como compor um conjunto de dados, neste caso?Tentei atribuir um alias e usá-lo em CREATE UNIQUE - não posso fazê-lo funcionar.O que estou fazendo de errado?É esse o cenário mesmo possível?

Foi útil?

Solução

Eu não compreendem o que você está depois, mas aqui está o que ocorre comigo quando eu olhar para a sua consulta.

Para começar, aqui está uma adaptação da consulta que usa SKIP e LIMIT sem RETURN ou UNION.

MATCH left, right
WHERE ID(left) IN [1,2,3] AND ID(right) IN [4,5,6]
WITH left, right 
    LIMIT 1
CREATE UNIQUE left-[rel:FRIEND]->right
WITH [rel] as rels  //If you want to return the relationship later you can put it in a collection and bring it WITH
MATCH left, right
WHERE ID(left) IN [1,2,3] AND ID(right) IN [4,5,6]
WITH left, right, rels 
    SKIP 4 LIMIT 1
CREATE UNIQUE left-[rel:FRIEND]->right
WITH rels + [rel] as rels
MATCH left, right
WHERE ID(left) IN [1,2,3] AND ID(right) IN [4,5,6]
WITH left, right, rels 
    SKIP 8 LIMIT 1
CREATE UNIQUE left-[rel:FRIEND]->right
WITH rels + [rel] as rels
RETURN LENGTH(rels), rels  // You can return the relationships here but SKIP/LIMIT does its job also if you don't return anything

Mas esta pergunta é um pouco selvagem.É realmente três consultas, onde os dois foram artificialmente comprimido como sub-consultas de primeira.Ele corresponde ao mesmo nós de novo em cada sub-consulta, e realmente não há nada ganhou, executando as consultas desta forma, ao invés de separadamente (é realmente mais lento, porque em cada sub-consulta a corresponder também a nós você sabe que você não vai usar).

Assim, a minha primeira sugestão é a utilização de START em vez de MATCH...WHERE quando chegar a nós por id.Como está, a consulta vincula-se a cada nó do banco de dados como "de esquerda" e, em seguida, cada nó do banco de dados como "direito" e, em seguida, filtra todos os nós ligados a "esquerda" que não se encaixam na condição de WHERE cláusula e, em seguida, o mesmo de "direito".Uma vez que esta parte da consulta é repetido três vezes, todos os nós no banco de dados estão vinculados um total de seis vezes.O que é caro para a criação de três relacionamentos.Se você usar START você pode vincular os nós que você quer de imediato.Isto realmente não responder sua pergunta, mas ele será mais rápido e a consulta será mais limpo.Portanto, use START para obter a nós pela sua identificação interna.

START left = node(1,2,3), right = node(4,5,6)

A segunda coisa que eu acho é que a diferença entre nós e os 'caminhos' ou 'resultado dos itens quando você correspondência de padrões.Quando você vincular três nós em "esquerda" e de três outros nós na "direita", você não tem três itens de resultado, mas nove.Para cada nó ligado na "esquerda", você receber três resultados, porque há três possíveis "direito" para combinar com ele.Se você queria se relacionam com cada "esquerda" para cada "direito", ótimo.Mas eu acho que o que você está procurando são os itens de resultado (1),(4), (2),(5), (3),(6), e , embora parece conveniente vincular a três "esquerda" nós e três "direito" nós, em uma consulta com coleções de id de nó, você, então você precisa fazer tudo o que a filtragem de se livrar dos 6 indesejados jogos.A consulta fica complexo e complicado, e realmente mais lento do que executar as consultas separadamente.Outra maneira de dizer isso é dizer que (1)-[:FRIEND]->(4) é um padrão diferente, não (pertinência) conectado a outros padrões que você está criando.Seria diferente se você queria para criar (1)-[:FRIEND]->(2)<-[:FRIEND]-(3), e , em seguida, você iria querer lidar com esses três nós juntos.Talvez você está apenas explorando franja usa de cypher, mas eu pensei que eu deveria apontar para fora.Pelo caminho, utilizando SKIP e LIMIT desta forma, é um pouco off-chave, elas não são realmente destinados a correspondência de padrão e de filtragem.É também imprevisível, a menos que você use também ORDER BY, já que não há nenhuma garantia de que os resultados serão em uma determinada ordem.Você não sabe qual o item de resultado é que se está passada.De qualquer maneira, neste caso, eu acho que seria melhor ligar os nós e criar relacionamento a três consultas separadas.

START left = node(1), right = node(4)
CREATE UNIQUE left-[rel:FRIEND]->right
RETURN rel

START left = node(2), right = node(5)
CREATE UNIQUE left-[rel:FRIEND]->right
RETURN rel

START left = node(3), right = node(6)
CREATE UNIQUE left-[rel:FRIEND]->right
RETURN rel

Desde que você já sabe o que você quer que os três pares, e não, digamos, (1),(4),(1),(5),(1),(6) faria sentido para consulta apenas para os pares, e a maneira mais fácil é consultar separadamente.

Mas em terceiro lugar, desde a três consultas são estruturalmente idênticos, diferindo apenas no valor da propriedade (se o id é para ser considerada como uma propriedade) você pode simplificar a consulta generalizando ou de anonimato que o que as distingue, por exemplo,parâmetros de uso.

START left = node({leftId}), right = node({rightId})
CREATE UNIQUE left-[rel:FRIEND]->right
RETURN rel

parameters: {leftId:1, rightId:4}, {leftId:2, rightId:5}, {leftId:3, rightId:6}

Uma vez que a estrutura é idêntica, a cifra pode armazenar em cache no plano de execução.Isto faz para um bom desempenho, e a consulta é organizada, de fácil manutenção e pode ser estendido facilmente se mais tarde você quiser fazer a mesma operação no outro pares de nós.

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