У меня есть схема базы данных neo4j, которая выглядит следующим образом:
(a:Author)<-[r:HAS_AUTHOR]-(n:Article)-[rel:HAS_DESCRIPTOR]->(d:Descriptor)
Я хотел бы сделать запрос, показывающий связь между авторами и дескрипторами, отфильтрованные по авторам, которые опубликовали более одного раза (count (r)> 1) и для дескрипторов, которые встречались в более чем одной статье (count (rel)> 1)
Вот запрос, который я написал:
MATCH (a:Author)<-[r:HAS_AUTHOR]-(n:Article)-[rel:HAS_DESCRIPTOR]->(d:Descriptor)
WITH a,count(r) as cnt WHERE cnt>1
MATCH (a:Author)<-[r:HAS_AUTHOR]-(n:Article)-[rel:HAS_DESCRIPTOR]->(d:Descriptor)
WITH d,count(rel) as cnt1 WHERE cnt1>1
MATCH (a:Author)<-[r:HAS_AUTHOR]-(n:Article)-[rel:HAS_DESCRIPTOR]->(d:Descriptor)
RETURN * limit 100
Это некажется, делаю то, что я ожидаю.Я все еще вижу авторов или дескрипторов, связанных с одной статьей.
Обратите внимание, что количество отношений следует рассматривать только в контексте запроса (т. Е .: с пределом 100, все авторы должны быть связаны сболее одной статьи в графе вывода запроса).
Это правильный способ написать этот запрос?Спасибо
РЕДАКТИРОВАТЬ
Прошу прощения за недостаточную ясность.
Если я выполню простой запрос, показывающий все графы автора - статьи - дескриптора, я могу получить некоторые изсценарий на рисунках ниже.
На всех изображениях желтые узлы - это статьи, зеленый - авторы, а розовый - дескрипторы.
Сценарий 1: статья, в которой упоминается только дескриптор.Я хотел бы отфильтровать те дескрипторы, которые упоминаются только в одной статье.
Сценарий 2: дескриптор, упомянутый более чем в одной статье, ночьи авторы не опубликовали никаких других статей.Я хотел бы отфильтровать тех авторов, которые опубликовали только одну статью
Эти два фильтра должны применяться на уровне подграфа.Например: если я фильтрую до определенного типа дескриптора, то в этом новом подграфе должны быть выполнены два условия (автор и дескриптор с более чем одной статьей).
Первый предложенный запрос сгенерируетграфики, как на рисунке ниже:
MATCH (a:Author)
WHERE size((a)<-[:HAS_AUTHOR]-()) > 1
MATCH (a)<-[:HAS_AUTHOR]-(n:Article)-[:HAS_DESCRIPTOR]->(d:Descriptor)
WITH a, d, collect(n) as articles
WHERE size(articles) > 1
RETURN a, d, articles
Сборник (n) как статьи для пары a, d вынуждает автора дважды публиковаться на одном и том же дескрипторе, что нежелательно.Я бы хотел, чтобы появился автор, опубликовавший статьи на 2 разных дескриптора.
Второй предложенный запрос генерирует графики, как показано на рисунке ниже:
MATCH (d:Descriptor)
WHERE size((d)<-[:HAS_DESCRIPTOR]-()) > 1
WITH collect(d) as descriptors
MATCH (a:Author)
WHERE size((a)<-[:HAS_AUTHOR]-()) > 1
MATCH (a)<-[:HAS_AUTHOR]-(n:Article)-[:HAS_DESCRIPTOR]->(d)
WHERE d in descriptors
RETURN a, n, d
Обратите внимание, что я добавил фильтр по типу дескриптора, чтобызапрос может быть запущен, и я не уверен, повлияет ли это на условие фильтрации.Здесь показаны дескрипторы и автор, связанные с одной статьей.