Neo4j шифрование запросов по количеству отношений - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть схема базы данных 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: статья, в которой упоминается только дескриптор.Я хотел бы отфильтровать те дескрипторы, которые упоминаются только в одной статье.

enter image description here

Сценарий 2: дескриптор, упомянутый более чем в одной статье, ночьи авторы не опубликовали никаких других статей.Я хотел бы отфильтровать тех авторов, которые опубликовали только одну статью

enter image description here

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

Первый предложенный запрос сгенерируетграфики, как на рисунке ниже:

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 разных дескриптора.enter image description here

Второй предложенный запрос генерирует графики, как показано на рисунке ниже:

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

Обратите внимание, что я добавил фильтр по типу дескриптора, чтобызапрос может быть запущен, и я не уверен, повлияет ли это на условие фильтрации.Здесь показаны дескрипторы и автор, связанные с одной статьей.enter image description here

1 Ответ

0 голосов
/ 13 февраля 2019

Первая оптимизация предназначена для фильтрации: авторов, которые опубликовали более одного раза.Все, что для этого требуется, - это проверка степени: отношения HAS_AUTHOR от автора, что можно сделать дешево, так как узел знает типы и количество связанных с ним связей.Вы можете использовать функцию size() в шаблоне, чтобы получить это: WHERE size((author)<-[:HAS_AUTHOR]-()) > 1.

Далее, чтобы получить шаблоны с дескрипторами, которые встречаются в более чем одной статье, нам нужно выполнить агрегацию статей по авторуи дескриптор, сохраняя только строки, в которых имеется более одной статьи.

Попробуйте это:

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

Возвращает строки, содержащие автора, дескриптор и коллекцию статей (>1) по статье с заданным дескриптором.

EDIT

Похоже, вы хотите отфильтровать: дескрипторы, которые были упомянуты более одного раза, независимо от автора, а не по подграфумы формируем запрос.

В этом случае лучше предварительно сопоставить их и отфильтровать, затем собрать и использовать эту коллекцию для некоторых операций над множествами, когда мы расширяем подграф.

MATCH (d:Descriptor)
WHERE size((d)<-[:HAS_DESCRIPTION]-()) > 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
...