Neo4J: оптимизация запросов / проверка моделей - PullRequest
0 голосов
/ 04 июля 2018

Новичок в Neo4J, поэтому заранее извиняюсь, если я делаю что-то ужасно неправильно. Я пытаюсь показать пользовательские статьи, в которых они могут быть заинтересованы, основываясь на выбранных категориях и тегах, которые им понравились независимо. Моя модель в Neo4j примерно такая

(:USER)-[:LIKES]->(:TAG)
(:ARTICLE)-[:PUBLISHED_BY]->(:PROVIDER)
(:ARTICLE)-[:HAS_CATEGORY]->(:CATEGORY)
(:USER)-[:DISLIKES]-(:ARTICLE)
(:USER)-[:INTERESTED_IN]->(:CATEGORY)

Когда я пытаюсь выполнить следующий запрос, чтобы получить желаемые результаты ... Я получаю их, но выполнение запроса занимает 16-18 секунд.

MATCH (u:USER {id: $userid})-[:LIKES]->(t:TAG) 
WITH u,t, collect(t.name) as tags 
UNWIND tags as tag with u,tag 
MATCH (c:CATEGORY)<-[*]-(a:ARTICLE)-[pub:PUBLISHED_BY]->(p:PROVIDER) 
WHERE a.keywords contains tag OR c.id in $categoryArray 
  AND NOT (u)-[:DISLIKES]->(a) 
RETURN DISTINCT a.id AS id, a.title AS title, pub.pubDate 
ORDER BY pub.pubDate DESC LIMIT 250

Есть ли более быстрый и лучший способ получить желаемые результаты? Примечание: я использую версию Neo4j 3.4.1 на машине с Ubuntu с кешем страниц: 512 МБ и размером кучи MIN & MAX: 1500 МБ

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Спасибо @Michael. Я понимаю, что наличие тегов в качестве отдельных узлов, связанных со статьями, ускорит поиск, но следующий запрос сократил время поиска с 16-18 секунд до 3-4 секунд

MATCH (u:USER {id: $userId})-[:INTERESTED_IN]->(c:CATEGORY)<-[*]-(a:ARTICLE)[pub:PUBLISHED_BY]->(p:PROVIDER) WHERE NOT (u)-[:DISLIKES]->(a) RETURN DISTINCT a.id, a.title, pub.pubDate ORDER BY pub.pubDate DESC LIMIT 150 UNION MATCH (u:USER {id: $userId})-[:LIKES]->(t:TAG) WITH u, t, collect(t.name) AS tags UNWIND tags AS tag MATCH (a:ARTICLE)-[pub:PUBLISHED_BY]-(:PROVIDER) WHERE a.keywords CONTAINS tag AND NOT (u)-[:DISLIKES]->(a) RETURN DISTINCT a.id, a.title, pub.pubDate ORDER BY pub.pubDate DESC LIMIT 150
0 голосов
/ 04 июля 2018

Было бы лучше, если бы в вашей модели статьи были связаны с тегами.

Этот бит: a.keywords contains tag не поддерживается индексами, поэтому он приведет к полному сканированию.

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

MATCH (u:USER {id: $userid})-[:LIKES]->(tag:TAG) 
MATCH (a:ARTICLE)-[:HAS_TAG]->(tag)
WITH distinct u, a
WHERE any(c IN categories WHERE NOT shortestPath((c)<-[:IN_CATEGORY*]-(a)) IS NULL)
  AND NOT (u)-[:DISLIKES]->(a) 
MATCH (a)-[pub:PUBLISHED_BY]->(p:PROVIDER) 
RETURN DISTINCT a.id AS id, a.title AS title, pub.pubDate 
ORDER BY pub.pubDate DESC LIMIT 250

Также проверьте план запроса с помощью PROFILE, чтобы увидеть любые узкие места или неиндексированные поля (вы можете расширить поля с помощью двойной стрелки в правом нижнем углу)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...