Сложный запрос Neo4J Cypher

изображение проблемыI имеет следующий сценарий на изображении: красные узлы - это темы, желтые узлы - названия курсов. Мне нужно найти последнюю тему курса CS201. В этом примере это должна быть тема «Массив». Я не могу превратить это в язык зашифрованных запросов. Я пытался :

MATCH (n:course)-[:isPartOf]->(x:label) where not x.name contains 'CS201' return n

Это должно дать мне тему «Указатель», поскольку она не содержит CS201, и тогда я подумал, что вернусь на шаг назад, чтобы добраться до темы «Массив». Однако это не работает.

Сложный запрос Neo4J Cypher

Основываясь на вашем комментарии к моему ответу, я не понял проблемы, не могли бы вы объяснить больше?

mastisa 09.09.2018 13:44

Если я выберу курс CS201, я сначала выучу «Список», затем выучу «Массив», а затем я закончу курс CS201. Если я хочу изучить CS204, я сначала выучу «Массив» (потому что это тема, которая есть как в CS201, так и в CS204), затем я выучу Pointer и закончу CS204. Проблема в том, как узнать последний курс CS201? Это не указатель, потому что это только часть CS204, поэтому это должен быть массив тем.

Cem Aytekin 09.09.2018 13:50

Я обновляю свой ответ, но не могу его проверить, можете ли вы проверить его на своей базе данных? надеюсь, это поможет

mastisa 10.09.2018 06:45

Почему имеется несколько узлов CS20 [1-4]? Если бы вы могли объединить повторяющиеся узлы, вы могли бы просто выполнить обратную трассировку с помощью чего-то вроде MATCH p=(c:Course)<-[*]-(t:Topic) RETURN c as course, t as topic, SIZE(NODES(p)) as priority. В противном случае будет сложнее определить «последний» в шифре. (используйте @Tezra, чтобы уведомить меня при воспроизведении: 3). Вам нужен полный список тем для класса (и порядок)? Или, учитывая класс, какую первую тему вы должны изучить? (Ярлыки в этом ответе основаны на данных, а не на фактических метках данных, которые сбивают с толку = P)

Tezra 14.09.2018 19:50
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
808
2

Ответы 2

Думаю, вы перепутали направление и названия.

MATCH (course:course)<-[:isPartOf]-(topic:label)<-[:hasPreq]-(prevTopic:label) 
where course.name contains 'CS201' 
return topic, prevTopic

Почему у вас есть дублирующиеся записи на курсы? Вероятно, вы не использовали MERGE при создании данных.

К сожалению, он мне ничего не возвращает. Соглашение об именах не очень хорошее, но в основном красные узлы - это темы (тип курса), желтые - курсы, и каждый красный узел = тема может быть частью нескольких курсов (желтые). Когда человек хочет узнать последнюю тему курса CS201, он должен сказать, что это тема Array, потому что после массива нет темы, которая принадлежит CS201 (указатель не принадлежит CS201)

Cem Aytekin 09.09.2018 12:50

НА УДЕРЖИВАНИИ

Используйте этот шифр:

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)

Cem Aytekin 09.09.2018 12:50

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