Последовательность шифр-флип-флопа: обход с альтернативными направлениями ребер (AgensGraph) - PullRequest
0 голосов
/ 02 марта 2019

Предположим, мы моделируем пары с двумя вершинными метками, женский и мужской, и с одной меткой ребер, датНаправление ребра всегда от женского к мужскому.

Ожидаемый список результатов запроса - пары, в которых существует ненаправленный путь от начальной вершины к вершинам каждой пары, отличным.

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

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

Sample graph

Критерий фильтра: { 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);

1 Ответ

0 голосов
/ 05 марта 2019

Я попытался воспроизвести ваш запрос в Agensgraph, но последний запрос на совпадение у меня не сработал, поэтому я не смог проверить его объяснение.

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

match (f:female)<-[r:dates*]->(m:male{name:'Adam'}) with distinct f
match p = ((f)-[:dates]->(m:male)) return p;

--------------------------------------------------------------------------
[female[73.1]{"name": "Alice"},dates[71.23][73.1,74.1]{},male[74.1]{"name": "Adam"}]
[female[73.1]{"name": "Alice"},dates[71.24][73.1,74.2]{},male[74.2]{"name": "Bob"}]
[female[73.2]{"name": "Barbara"},dates[71.25][73.2,74.2]{},male[74.2]{"name": "Bob"}]
[female[73.2]{"name": "Barbara"},dates[71.26][73.2,74.3]{},male[74.3]{"name": "Charles"}]
[female[73.2]{"name": "Barbara"},dates[71.27][73.2,74.5]{},male[74.5]{"name": "Edgar"}]
[female[73.3]{"name": "Chloe"},dates[71.28][73.3,74.2]{},male[74.2]{"name": "Bob"}]
[female[73.3]{"name": "Chloe"},dates[71.29][73.3,74.4]{},male[74.4]{"name": "Daniel"}]
[female[73.3]{"name": "Chloe"},dates[71.30][73.3,74.5]{},male[74.5]{"name": "Edgar"}]
[female[73.4]{"name": "Diane"},dates[71.31][73.4,74.5]{},male[74.5]{"name": "Edgar"}]
[female[73.5]{"name": "Eve"},dates[71.32][73.5,74.5]{},male[74.5]{"name": "Edgar"}]
(10 rows)

Честно говоря, я не очень уверен в производительности вышеуказанного запроса, когда объем данных огромен.

Пожалуйста, оставьте мне свой отзыв после запусказапрос.

Отредактировано 25 марта.

Может ли это быть решением для вашего дела?

match p = allshortestpaths( (f:female)<-[r:dates*]->(m:male) )
where any(node in to_jsonb(nodes(p)) where node.properties.name starts with 'Adam' )
return p;

enter image description here

...