Se o número de propriedades for maior que n, retorne de um gráfico altamente conectado no Neo4j

Esta pergunta é uma extensão direta de uma pergunta que eu fiz anteriormenteaqui (e até versão anterioraqui)

Digamos que eu tenha um banco de dados de gráficos parecido com este:

Assim como as perguntas anteriores que fiz, a única coisa realmente interessante sobre isso é queSomeProperty pode ser 'Sim' ou 'Não'.

Na linha superior, um dos três nós possui um 'Sim' para esta propriedade.

Na linha inferior, três nós dos cinco nós têm um 'Sim' para esta propriedade.

(Nota lateral filosófica leve: Estou começando a suspeitar que este é um esquema gráfico incorreto. Por quê? Porque, dentro de cada conjunto de nós, cada nó está conectado a todos os outros nós. Não estou preocupado com o fato de haver dois grupos de nós, mas com o fato de que, quando preencho esse gráfico, recebo um retorno que diz: 'Retornou 530 linhas'. Acho que isso significa que na verdade criamos 530 subcaminhos na estrutura do gráfico e isso parece um exagero.)

De qualquer forma, o problema que estou tentando resolver é praticamente o mesmo que estava tentando resolver no contexto anterior, mais simples e mais linearaqui.

Eu quero retornar o caminho completo de qualquer um desses gráficos disjuntos, enquanto que em qualquer lugar dentro do gráfico contamos as ocorrências deSomeProperty é maior que 2.

Eu pensaria que este é um problema comum e simples. Por exemplo, digamos que você tenha duas famílias não relacionadas e alguém diga: "Mostre-me que a família tem mais de duas pessoas canhotas".

O #cybersam super inteligente recomendado para a encarnação mais simples desse problema, algo como:

MATCH p=(a:person)-[:RELATED_TO*]->(b:person)
WHERE
  NOT ()-[:RELATED_TO]->(a) AND
  NOT (b)-[:RELATED_TO]->() AND
  2 < REDUCE(s = 0, x IN NODES(p) | CASE WHEN x. SomeProperty = 'Yes' THEN s + 1 ELSE s END)
RETURN p;

... o que funciona muito bem se o gráfico se assemelhar mais a uma linha reta e não tiver cada nó no conjunto relacionado um ao outro.

Acho que a razão pela qual a consulta do # cybersam não lida com esse gráfico mais complexo é porque não há nó terminal.

(Outra nota lateral filosófica: Estou começando a apresentar teorias de que relacionamentos densos e intrincados em um gráfico apresentam problemas combinatórios, tanto com desempenho quanto com consultas. Eu acho que isso pode ser devido à bidirecionalidade usada pelo Cypher ao consultar?)

Aqui estão os meus dados. Qualquer conselho é apreciado e obrigado por me ajudar a subir a curva de aprendizado.

// match (n) detach delete n;

CREATE (albert:person {gender: 'Male', name: 'Albert', SomeProperty: 'Yes'})
CREATE (annie:person {gender: 'Female', name: 'Annie', SomeProperty: 'No'})
CREATE (adrian:person {gender: 'Female', name: 'Adrian', SomeProperty: 'No'})

CREATE (albert)-[:RELATED_TO]->(annie)
CREATE (annie)-[:RELATED_TO]->(albert)
CREATE (annie)-[:RELATED_TO]->(adrian)
CREATE (adrian)-[:RELATED_TO]->(annie)
CREATE (albert)-[:RELATED_TO]->(adrian)
CREATE (adrian)-[:RELATED_TO]->(albert)


CREATE (bill:person {gender: 'Male', name: 'Bill', SomeProperty: 'Yes'})
CREATE (barb:person {gender: 'Female', name: 'Barb', SomeProperty: 'Yes'})
CREATE (barry:person {gender: 'Male', name: 'Barry', SomeProperty: 'Yes'})
CREATE (bart:person {gender: 'Male', name: 'Bart', SomeProperty: 'No'})
CREATE (bartholemu:person {gender: 'Male', name: 'Bartholemu', SomeProperty: 'No'})

CREATE (bill)-[:RELATED_TO]->(barb)
CREATE (barb)-[:RELATED_TO]->(bill)
CREATE (barb)-[:RELATED_TO]->(barry)
CREATE (barry)-[:RELATED_TO]->(barb)
CREATE (barry)-[:RELATED_TO]->(bart)
CREATE (bart)-[:RELATED_TO]->(barry)
CREATE (bart)-[:RELATED_TO]->(bartholemu)
CREATE (bartholemu)-[:RELATED_TO]->(bart)
CREATE (bill)-[:RELATED_TO]->(bartholemu)
CREATE (bartholemu)-[:RELATED_TO]->(bill)

questionAnswers(1)

yourAnswerToTheQuestion