Предположим, мы моделируем пары с двумя вершинными метками, женский и мужской, и с одной меткой ребер, датНаправление ребра всегда от женского к мужскому.
Ожидаемый список результатов запроса - пары, в которых существует ненаправленный путь от начальной вершины к вершинам каждой пары, отличным.
Другими словами, результат должен содержать список ребер связанных компонент графа, в котором присутствует данная вершина.
Обратите внимание, что могут быть циклы, если исходный граф преобразуется вненаправленный граф.
Критерий фильтра: { name: 'Adam' }
Ожидаемый набор результатов:
Alice-[:dates]->Adam
Alice-[:dates]->Bob
Chloe-[:dates]->Bob
...
Eve-[:dates]->Edgar
Uhura-[:dates]->Spock
НЕ является частью набора результатов, поскольку между Адамом и (Ухурой или Споком) нет связи.
Следующее решение работает, но имеет низкую производительность, поэтому его нельзя использоватьв производстве:
match path = ()-[:dates*]-()
where any(node in to_jsonb(nodes(path)) where node.properties.name = 'Adam')
return distinct path;
(или return distinct edges(path)
, но AgensBrowser не любит возвращать края пути).
Не могли бы вы помочь мне с некоторыми советами для лучшего решения?Спасибо.
Тестовые данные:
create
(alice: female { name: 'Alice'}),
(barbara: female { name: 'Barbara'}),
(chloe: female { name: 'Chloe'}),
(diane: female { name: 'Diane'}),
(eve: female { name: 'Eve'}),
(uhura: female { name: 'Uhura'}),
(adam: male { name: 'Adam'}),
(bob: male { name: 'Bob'}),
(charles: male { name: 'Charles'}),
(daniel: male { name: 'Daniel'}),
(edgar: male { name: 'Edgar'}),
(spock: male { name: 'Spock'})
create (alice)-[:dates]->(adam),
(alice)-[:dates]->(bob),
(barbara)-[:dates]->(bob),
(barbara)-[:dates]->(charles),
(barbara)-[:dates]->(edgar),
(chloe)-[:dates]->(bob),
(chloe)-[:dates]->(daniel),
(chloe)-[:dates]->(edgar),
(diane)-[:dates]->(edgar),
(eve)-[:dates]->(edgar),
(uhura)-[:dates]->(spock);