Если количество свойств больше n, вернитесь из сильно связанного графа в Neo4j

Этот вопрос является прямым продолжением вопроса, который я задавал ранееВот (и даже более ранняя версияВот).

Скажем, у меня есть графовая база данных, которая выглядит так:

Как и предыдущие вопросы, единственное, что действительно интересно в этомSomeProperty может быть «Да» или «Нет».

В верхнем ряду 1 из трех узлов имеет «Да» для этого свойства.

В нижней строке 3 узла из пяти узлов имеют «Да» для этого свойства.

(Небольшой философский знакЯ начинаю подозревать, что это плохая схема графа. Зачем? Потому что в каждом наборе узлов каждый узел связан с каждым другим узлом. Меня не беспокоит тот факт, что есть две группы узлов, но тот факт, что когда я заполняю этот график, я получаю обратную связь, которая говорит: «Возвращено 530 строк». Я думаю, что это означает, что на самом деле в структуре графа создано 530 подпутей, и это кажется излишним.)

В любом случае, проблема, которую я пытаюсь решить, в значительной степени совпадает с проблемой, которую я пытался решить в более раннем, более простом, более линейном контексте.Вот.

Я хочу вернуть полный путь любого из этих непересекающихся графов, в то время как где-нибудь в пределах указанного графа подсчитывать вхожденияSomeProperty больше 2.

Я думаю, что это обычная, простая проблема. Например, скажем, у вас было две не связанные друг с другом семьи, а кто-то говорит: «Покажи мне с семьей более двух левшей».

Супер умный #cybersam рекомендуется для более простого воплощения этой проблемы, что-то вроде:

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;

... который отлично работает, если график больше напоминает прямую линию и не имеет каждого узла в наборе, связанного с каждым другим узлом.

Я думаю, что причина, по которой запрос # cybersam не обрабатывает этот более сложный граф, заключается в том, что нет конечного узла.

(Еще один философский знакЯ начинаю выдвигать теории о том, что плотные, сложные отношения в графе ставят комбинаторные проблемы, как с производительностью, так и с запросами. Я думаю, что это может быть связано с двунаправленностью, используемой Сайфером при запросе?)

Вот мои данные. Любой совет ценится и спасибо за помощь мне подняться по кривой обучения.

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

Ответы на вопрос(1)

Ваш ответ на вопрос