изображение проблемыI имеет следующий сценарий на изображении: красные узлы - это темы, желтые узлы - названия курсов. Мне нужно найти последнюю тему курса CS201. В этом примере это должна быть тема «Массив». Я не могу превратить это в язык зашифрованных запросов. Я пытался :
MATCH (n:course)-[:isPartOf]->(x:label) where not x.name contains 'CS201' return n
Это должно дать мне тему «Указатель», поскольку она не содержит CS201, и тогда я подумал, что вернусь на шаг назад, чтобы добраться до темы «Массив». Однако это не работает.
Если я выберу курс CS201, я сначала выучу «Список», затем выучу «Массив», а затем я закончу курс CS201. Если я хочу изучить CS204, я сначала выучу «Массив» (потому что это тема, которая есть как в CS201, так и в CS204), затем я выучу Pointer и закончу CS204. Проблема в том, как узнать последний курс CS201? Это не указатель, потому что это только часть CS204, поэтому это должен быть массив тем.
Я обновляю свой ответ, но не могу его проверить, можете ли вы проверить его на своей базе данных? надеюсь, это поможет
Почему имеется несколько узлов CS20 [1-4]? Если бы вы могли объединить повторяющиеся узлы, вы могли бы просто выполнить обратную трассировку с помощью чего-то вроде MATCH p=(c:Course)<-[*]-(t:Topic) RETURN c as course, t as topic, SIZE(NODES(p)) as priority
. В противном случае будет сложнее определить «последний» в шифре. (используйте @Tezra, чтобы уведомить меня при воспроизведении: 3). Вам нужен полный список тем для класса (и порядок)? Или, учитывая класс, какую первую тему вы должны изучить? (Ярлыки в этом ответе основаны на данных, а не на фактических метках данных, которые сбивают с толку = P)
Думаю, вы перепутали направление и названия.
MATCH (course:course)<-[:isPartOf]-(topic:label)<-[:hasPreq]-(prevTopic:label)
where course.name contains 'CS201'
return topic, prevTopic
Почему у вас есть дублирующиеся записи на курсы? Вероятно, вы не использовали MERGE при создании данных.
К сожалению, он мне ничего не возвращает. Соглашение об именах не очень хорошее, но в основном красные узлы - это темы (тип курса), желтые - курсы, и каждый красный узел = тема может быть частью нескольких курсов (желтые). Когда человек хочет узнать последнюю тему курса CS201, он должен сказать, что это тема Array, потому что после массива нет темы, которая принадлежит CS201 (указатель не принадлежит CS201)
НА УДЕРЖИВАНИИ
Используйте этот шифр:
MATCH (c:course {name: 'CS201'})<-[:isPartOf]-(t:topic)
OPTIONAL MATCH path=((t)-[:next*]->(:topic)-[:isPartOf]->(c))
RETURN t, count(relationships(path)) AS count_rels
ORDER BY count_rels
но он вернет массив и указатель как secondTopic
, как сказал @Michael Hunger в своем ответе, у вас есть дубликат курса CS201
, попробуйте уникальные ограничения, читать документы:
CREATE CONSTRAINT ON (course:course) ASSERT course.name IS UNIQUE
К сожалению, он возвращается пустым. Соглашение об именах не очень хорошее, но в основном красные узлы - это темы (тип курса), желтые - курсы, и каждый красный узел = тема может быть частью нескольких курсов (желтые). Когда человек хочет узнать последнюю тему курса CS201, он должен сказать, что это тема Array, потому что после массива нет темы, которая принадлежит CS201 (указатель не принадлежит CS201)
Основываясь на вашем комментарии к моему ответу, я не понял проблемы, не могли бы вы объяснить больше?