2017-01-29 3 views
0

Я пытаюсь улучшить систему обнаружения мошенничества для веб-сайта коммерции. Мы имеем дело с прямыми банковскими транзакциями, поэтому мошенничество - это риск, которым мы должны управлять. Недавно я узнал о графических базах данных и узнал, как это относится к этим проблемам. Итак, за последние пару дней я создал neo4j и проанализировал наши данные: exampleneo4j для обнаружения мошенничества - эффективная структура данных

Моей интуицией было создание узла для каждого заказа и узла для каждой связанной с ним части данных, а затем подключения все они вместе. Как это:

MATCH (w:Wallet),(i:Ip),(e:Email),(o:Order) 
WHERE w.wallet="ex" AND i.ip="ex" AND e.email="ex" AND o.refcode="ex" 
CREATE (w)-[:USED]->(o),(i)-[:USED]->(o),(e)-[:USED]->(o) 

Но этот запрос выполняется очень медленно по мере увеличения размера базы данных (я предполагаю, потому что нужно искать весь набор данных для узлов Я прошу). Он также занимает много времени, чтобы выполнить запрос, как это:

START a=node(179) 
MATCH (a)-[:USED*]-(d) 
WHERE EXISTS(d.refcode) 
RETURN distinct d 

Это предназначено, чтобы извлечь все заказы, которые подключены к исходной точке. Я очень новичок в Cypher (< 24 часа), и мне особенно сложно искать решения.

Существуют ли какие-либо конкретные проблемы с структурой данных или запросами, которые я могу адресовать для повышения производительности? Это идеальное решение для завершения такого рода вещей в течение нескольких секунд, как я ожидал бы от базы данных SQL. В это время у нас около 17 000 узлов.

ответ

0

Всегда хорошая идея, чтобы полностью прочитать developers manual.

Для ускорения поиска узлов по свойству вам определенно необходимо создать indexes or unique constraints (в зависимости от того, должно ли свойство быть уникальным для метки/значения).

Как только вы создали нужные вам индексы и ограничения, они будут использоваться под капотом по вашему запросу, чтобы ускорить ваши совпадения.

START используется только для устаревших индексов, а для последних версий Neo4j вместо этого вы должны использовать MATCH. Если вы согласны с внутренним идентификатором, вы можете использовать MATCH (n) WHERE id(n) = xxx.

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

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

MATCH (a)-[:USED*]-(d:Order) 
WHERE id(a) = 179 
RETURN distinct d 

На больших графиках, матч переменной длины может начать замедление, так что вы можете получить более высокую производительность за счет установки APOC Procedures и используя Path Expander процедуру, чтобы собрать все узлы подграфа и фильтровать вниз только узлы Order.

MATCH (a) 
WHERE id(a) = 179 
CALL apoc.path.expandConfig(a, {bfs:true, uniqueness:"NODE_GLOBAL"}) YIELD path 
RETURN LAST(NODES(path)) as d 
WHERE d:Order 
Смежные вопросы