Neo4J шифровый запрос для поиска похожих графиков - PullRequest
0 голосов
/ 20 апреля 2020

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

Например, у меня есть следующие три графика:

Graph similarity

Как видите, графики 1 и 2 похожи, а графики 3 отличается, потому что последний узел графа 3 имеет Label_4, а не Label_3 (как это имеет место для 1 и 2). Поэтому я хотел бы получить в результате запроса что-то вроде:

[a1->b1->c1,a2->b2->c2],[a3->b3->d3]

, тогда как a1->b1->c1 - это график 1, a2->b2->c2 - это график 2, а a3->b3->d3 - это график 3.

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

Для создания примера я использовал следующие команды:

CREATE (a1:Label_1 {name: "Label_1"})
CREATE (b1:Label_2 {name: "Label_2"})
CREATE (c1:Label_3 {name: "Label_3"})
CREATE (a2:Label_1 {name: "Label_1"})
CREATE (b2:Label_2 {name: "Label_2"})
CREATE (c2:Label_3 {name: "Label_3"})
CREATE (a3:Label_1 {name: "Label_1"})
CREATE (b3:Label_2 {name: "Label_2"})
CREATE (d3:Label_4 {name: "Label_4"})
CREATE (a1)-[:FOLLOWS]->(b1)
CREATE (b1)-[:FOLLOWS]->(c1)
CREATE (a2)-[:FOLLOWS]->(b2)
CREATE (b2)-[:FOLLOWS]->(c2)
CREATE (a3)-[:FOLLOWS]->(b3)
CREATE (b3)-[:FOLLOWS]->(d3)

1 Ответ

1 голос
/ 20 апреля 2020

Если вы: (A) пытаетесь сгруппировать завершить ориентированные графы (т.е. ориентированные графы, которые начинаются в узле root и заканчиваются в листовом узле), и (B) заинтересованы только в используя одну из (возможно, многих) меток для каждого узла, это должно работать (но из-за неограниченного отношения переменной длины это может занять очень много времени или нехватки памяти в больших БД) :

MATCH p = (n)-[*]->(m)
WHERE NOT ()-->(n) AND NOT (m)-->()
RETURN [x IN NODES(p) | LABELS(x)[0]] as labelPath, COLLECT(p)

Вы можете удалить ограничение (A), удалив предложение WHERE, но тогда вы получите гораздо больший набор результатов (и увеличите время до завершения и риск исчерпания) памяти).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...