Создание нового отношения с помощью Python-Neo4j не дает результатов

Я настраиваю основанную на времени базу данных графа, основываясь на следующем принципе проектирования:

У меня есть программа, которая должна создавать новые моменты времени (при необходимости) в базе данных. Я нахожу соответствующие узлы с помощью бинарного поиска, а затем пытаюсь удалить существующие отношения (при необходимости) и создать новые отношения.

Два узла (204452 и 203838), которые я пытаюсь соединить, существуют и могут быть получены с использованием следующего синтаксиса:

MATCH (y1:Year)-[:CONTAINS_MONTH]->(m1:Month)-[:CONTAINS_DAY]->(d1:Day)-[:CONTAINS_TIMEPOINT]->(t1:Time)
where (y1.year='2017' AND m1.month='02' AND d1.day='28' AND t1.time='204452')
return y1, m1, d1, t1

Вышеупомянутые запросы дают следующие подграфы (показывая, что отдельные запросы работают, верно?)

Однако, когда я пытаюсь создать соединение, используя следующий запрос:

MATCH (y1:Year {year:'2017'})-[:CONTAINS_MONTH]->(m1:Month {month:'02'})-[:CONTAINS_DAY]->(d1:Day {day:'28'})-[:CONTAINS_TIMEPOINT]->(t1:Time {time:'203838'}),
(y2:Year {year:'2017'})-[:CONTAINS_MONTH]->(m2:Month {month:'02'})-[:CONTAINS_DAY]->(d2:Day {day:'28'})-[:CONTAINS_TIMEPOINT]->(t2:Time {time:'204452'})
CREATE (t1)-[:NEXT_TIMEPOINT]->(t2)

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

Первый MATCH строка определяет и запускает первый подзапрос, возвращая подграф 203838. Второй MATCH строка определяет и запускает второй подзапрос, возвращая подграф 204452. Наконец, CREATE line создает связь между двумя временными узлами, полученными через вышеуказанные подзапросы.

Однако, поскольку ничего не происходит, я предполагаю, что мое понимание вышеупомянутого запроса неверно, и я хотел бы знать Q1. что он на самом деле делает и Q2. какой будет правильный способ сделать это?

1 ответ

Решение

О предупреждении, связанном с декартовым произведением: это происходит потому, что вы MATCHДва узла без каких-либо отношений между ними. Посмотрите здесь и здесь.

Чтобы решить это предупреждение, используйте два MATCHа не один. Я смоделировал ваш сценарий здесь. Это запрос для создания начального набора данных:

CREATE (y1:Year {year:'2017'})-[:CONTAINS_MONTH]->(m1:Month {month:'02'})-[:CONTAINS_DAY]->(d1:Day {day:'28'})-[:CONTAINS_TIMEPOINT]->(t1:Time {time:'203838'})
CREATE (y2:Year {year:'2017'})-[:CONTAINS_MONTH]->(m2:Month {month:'02'})-[:CONTAINS_DAY]->(d2:Day {day:'28'})-[:CONTAINS_TIMEPOINT]->(t2:Time {time:'204452'})

После (обратите внимание на два MATCH заявления):

MATCH (y1:Year {year:'2017'})-[:CONTAINS_MONTH]->(m1:Month {month:'02'})-[:CONTAINS_DAY]->(d1:Day {day:'28'})-[:CONTAINS_TIMEPOINT]->(t1:Time {time:'203838'})
MATCH (y2:Year {year:'2017'})-[:CONTAINS_MONTH]->(m2:Month {month:'02'})-[:CONTAINS_DAY]->(d2:Day {day:'28'})-[:CONTAINS_TIMEPOINT]->(t2:Time {time:'204452'})
CREATE (t1)-[:NEXT_TIMEPOINT]->(t2)

Результат:

Результат

Другие вопросы по тегам