Создание нового отношения с помощью 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)
Результат: