2015-11-15 3 views
0

Я делаю проект по мошенничеству с кредитными картами, и у меня есть некоторые сгенерированные данные образца в .CSV (с разделителями каналов), где каждая строка - это в основном информация человека, данные транзакции вместе с именем продавца и т. д. Поскольку это сгенерированные данные, есть также флаг, указывающий, была ли эта транзакция мошеннической или нет.Основные/концептуальные проблемы, производительность запросов с Cypher и Neo4J

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

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

Вот несколько строк, например, данные ..

ssn|cc_num|first|last|gender|street|city|state|zip|lat|long|city_pop|job|dob|acct_num|profile|trans_num|trans_date|trans_time|unix_time|category|amt|is_fraud|merchant|merch_lat|merch_long 
692-42-2939|5270441615999263|Eliza|Stokes|F|684 Abigayle Port Suite 372|Tucson|AZ|85718|32.3112|-110.9179|865276|Science writer|1962-12-06|563973647649|40_60_bigger_cities.json|2e5186427c626815e47725e59cb04c9f|2013-03-21|02:01:05|1363831265|misc_net|838.47|1|fraud_Greenfelder, Bartoletti and Davis|31.616203|-110.221915 
692-42-2939|5270441615999263|Eliza|Stokes|F|684 Abigayle Port Suite 372|Tucson|AZ|85718|32.3112|-110.9179|865276|Science writer|1962-12-06|563973647649|40_60_bigger_cities.json|7d3f5eae923428c51b6bb396a3b50aab|2013-03-22|22:36:52|1363991812|shopping_net|907.03|1|fraud_Gerlach Inc|32.142740|-111.675048 
692-42-2939|5270441615999263|Eliza|Stokes|F|684 Abigayle Port Suite 372|Tucson|AZ|85718|32.3112|-110.9179|865276|Science writer|1962-12-06|563973647649|40_60_bigger_cities.json|76083345f18c5fa4be6e51e4d0ea3580|2013-03-22|16:40:20|1363970420|shopping_pos|912.03|1|fraud_Morissette PLC|31.909227|-111.3878746 

Пример файла Я использую около 60k сделок

Ниже мой высчитывать запрос/код до сих пор.

USING PERIODIC COMMIT 1000 
LOAD CSV WITH HEADERS FROM "card_data.csv" 
AS line FIELDTERMINATOR '|' 


CREATE (p:Person { id: toInt(line.cc_num), name_first: line.first, name_last: line.last }) 
CREATE (m:Merchant { id: line.merchant, name: line.merchant }) 
CREATE (t:Transaction { id: line.trans_num, merchant_name: line.merchant, card_number:line.cc_num, amount:line.amt, is_fraud:line.is_fraud, trans_date:line.trans_date, trans_time:line.trans_time }) 

create constraint on (t:Transaction) assert t.trans_num is unique; 
create constraint on (p:Person) assert p.cc_num is unique; 

MATCH (m:Merchant) 
WITH m 
MATCH (t:Transaction{merchant_name:m.merchant,is_fraud:1}) 
CREATE (m)-[:processed]->(t) 

Вы можете увидеть в 2 MATCH запрос, я пытаюсь определить, что мы только рассмотрим мошеннические операции (is_fraud: 1), и из примерно 65 тысяч сделок, 230 имеют is_fraud: 1.

Любые идеи, почему этот запрос будет работать бесконечно? У меня есть МНОГО БОЛЬШИХ наборов данных, которые я хотел бы изучить таким образом, и небольшие результаты данных пока не являются многообещающими (я уверен, из-за моего отсутствия понимания, а не ошибки Neo4j).

ответ

0

Вы не указали создание индекса. Чтобы ускорить процесс, вы должны создать индекс на обоих merchant_name и is_fraud, чтобы не идти через все узлы транзакции последовательно для данного коммерсанта:

CREATE INDEX ON :Transaction(merchant_name) 
CREATE INDEX ON :Transaction(is_fraud) 
+0

Спасибо, Дэвид! Это сработало, хотя теперь я не совсем понимаю, чего я ожидал. У меня есть центральный узел, который является мошеннической транзакцией (и только 1 из 230 транзакций мошенничества), подключенной к 25 другим узлам торговца типа с тем же именем. То, что я надеялся увидеть, было торговцем, связанным с мошенническими транзакциями .. так идеально один или два торговца в качестве центральных узлов, связанных со всеми мошенническими транзакциями, имевшими место у данного торговца. Возможно, это не мой запрос? – nameBrandon

+0

Ссылка на изображение - http://i.imgur.com/43ZUw8h.png Центральный узел является мошенническим Tx, синие узлы, похоже, повторяются у одного и того же торговца (одно имя, другое значение «id»). – nameBrandon

0

создаются дубликаты записей, как для продавцов, так и для людей.

// not really needed if you don't merge transactions 
// and if you don't look up transactions by trans_num 
// create constraint on (t:Transaction) assert t.trans_num is unique; 

// can't a person use multiple credit cards? 
create constraint on (p:Person) assert p.cc_num is unique; 

create constraint on (p:Person) assert p.id is unique; 
create constraint on (m:Merchant) assert m.id is unique; 




USING PERIODIC COMMIT 1000 
LOAD CSV WITH HEADERS FROM "card_data.csv" AS line FIELDTERMINATOR '|' 


MERGE (p:Person { id: toInt(line.cc_num)}) 
    ON CREATE SET p.name_first=line.first, p.name_last=line.las 
MERGE (m:Merchant { id: line.merchant}) ON CREATE SET m.name = line.merchant 

CREATE (t:Transaction { id: line.trans_num, card_number:line.cc_num, amount:line.amt, merchant_name: line.merchant, 
     is_fraud:line.is_fraud, trans_date:line.trans_date, trans_time:line.trans_time }) 

CREATE (p)-[:issued]->(t) 

// only connect fraudulent transactions to the merchant 
WHERE t.is_fraud = 1 
// also add indicator label to transaction for easier selection/processing later 
SET t:Fraudulent  
CREATE (m)-[:processed]->(t); 

В качестве альтернативы вы можете подключить все ОЕ к торговцу и указать мошенничества только с помощью меток/альтернативных REL-типов.

+0

Спасибо большое! – nameBrandon

Смежные вопросы