Поиск по тегу производительности запроса Neo4j - PullRequest
0 голосов
/ 08 мая 2018

Я хочу фильтровать сообщения по некоторым словам (тегам).

Пока только я не хочу сообщений, которые имеют 2 слова.

Мы создали временное дерево, чтобы нам не приходилось искать во всех сообщениях. В лучшем случае я не буду искать один месяц (30 дней).

В этом месяце 57,371 сообщений.

PROFILE
MATCH (startleaf:Hour{hash: '2018/04/01/05'})
, (endleaf:Hour{hash: '2018/04/30/05'})
, p = shortestPath((startleaf)-[:NEXT*0..]->(endleaf))
UNWIND nodes(p) AS leaf
MATCH (leaf)<-[:SENDED]-(message:TS_P2000Message)
WITH distinct message
MATCH (message)-[:HAS_WORD]->(TS_Word { name:'someren'})
WITH distinct message AS message
MATCH (message)-[:HAS_WORD]->(TS_Word { name:'kruisbaan'})
WITH distinct message AS message
WITH count(message) AS results, collect(message) AS messages
UNWIND(messages) AS message
WITH results, message AS message
SKIP 0 LIMIT 15
RETURN results, message

Cypher version: CYPHER 3.3, planner: COST, runtime: INTERPRETED. 1065560 total db hits in 2244 ms.

просмотреть профиль

Когда мне не нужны все сообщения без фильтра слов, запрос выполняется быстрее!

PROFILE
MATCH (startleaf:Hour{hash: '2018/04/01/05'})
, (endleaf:Hour{hash: '2018/04/30/05'})
, p = shortestPath((startleaf)-[:NEXT*0..]->(endleaf))
UNWIND nodes(p) AS leaf
MATCH (leaf)<-[:SENDED]-(message:TS_P2000Message)
WITH distinct message
WITH count(message) AS results, collect(message) AS messages
UNWIND(messages) AS message
WITH results, message AS message
SKIP 0 LIMIT 15
RETURN results, message

Cypher version: CYPHER 3.3, planner: COST, runtime: INTERPRETED. 115167 total db hits in 268 ms.

Когда мы меняем запрос на одну неделю, это очень быстро, но для лучшего результата я хочу один месяц.

Так, что я могу сделать, чтобы сделать этот запрос немного быстрее?

Может быть, это поможет, этот экран покажет структуру. Preview

EDIT:

Когда я не использую слова и делаю ГДЕ с регулярным выражением, это быстрее ...

PROFILE
MATCH (startleaf:Hour{hash: '2018/04/01/05'})
, (endleaf:Hour{hash: '2018/04/30/05'})
, p = shortestPath((startleaf)-[:NEXT*0..]->(endleaf))
UNWIND nodes(p) AS leaf
MATCH (leaf)<-[:SENDED]-(message:TS_P2000Message)
WHERE message.message =~ '(?i).*someren.*' AND message.message =~ '(?i).*kruisbaan.*'
WITH count(message) AS results, collect(message) AS messages
UNWIND(messages) AS message
WITH results, message AS message
SKIP 0 LIMIT 15
RETURN results, message

Cypher version: CYPHER 3.3, planner: COST, runtime: INTERPRETED. 115186 total db hits in 342 ms.

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Вы забыли двоеточие для метки перед :TS_Word Вы должны иметь индекс на :TS_Word(name)

Я думаю, что отправленные слова более ограничивающие, чем ваш фильтр времени.

Так я бы сделал:

MATCH (message:TS_P2000Message)-[:HAS_WORD]->(:TS_Word { name:'someren'}),
      (message)-[:HAS_WORD]->(:TS_Word { name:'kruisbaan'})
MATCH (leaf:Hour)<-[:SENDED]-(message)
WHERE '2018/04/01/05' <= leaf.hash <= '2018/04/30/05'
WITH count(message) AS results, collect(message) AS messages
UNWIND messages AS message
RETURN results, message
SKIP 0 LIMIT 15
0 голосов
/ 09 мая 2018

Можете ли вы попробовать этот запрос:

MATCH  p = shortestPath((startleaf:Hour{hash: '2018/04/01/05'})-[:NEXT*0..]->(endleaf:Hour{hash: '2018/04/30/05'}))
WITH NODES(p) AS dates
  MATCH (message:TS_P2000Message)-[:SENDED]->(leaf),
        (message)-[:HAS_WORD]->(TS_Word)
  WHERE leaf IN dates AND
        message.name IN ['kruisbaan', 'someren']
  WITH distinct message AS message
  WITH count(message) AS results, collect(message) AS messages
  UNWIND(messages) AS message
  WITH results, message AS message
  SKIP 0 LIMIT 15
  RETURN results, message

А также, можете ли вы попробовать этот запрос с индексом на :TS_P2000Message(name)

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