2014-11-18 3 views
1

저는 neo4j의 기본 사항을 배우고 있으며 신용 카드 사기 https://linkurio.us/stolen-credit-cards-and-fraud-detection-with-neo4j으로 다음 예제를보고 있습니다. 쇼핑 모든 손상 사용자가 그러나많은 수의 노드에 대한 Neo4j 색인 생성

MATCH (victim:person)-[r:HAS_BOUGHT_AT]->(merchant) 
WHERE r.status = “Disputed” 
MATCH victim-[t:HAS_BOUGHT_AT]->(othermerchants) 
WHERE t.status = “Undisputed” AND t.time < r.time 
WITH victim, othermerchants, t ORDER BY t.time DESC 
RETURN DISTINCT othermerchants.name as suspicious_store, count(DISTINCT t) as count, collect(DISTINCT victim.name) as victims 
ORDER BY count DESC 

곳에 매장을 찾아 사이퍼 쿼리 할 때 사용자의 수를 초기 쿼리 모두를 통과해야하므로,이 쿼리가 느려질 수 있습니다 (의 사용자의 수백만 가정 해 봅시다) 증가 사람이라고 표시된 노드. 트랜잭션 대신 노드에 속성을 할당하여 쿼리 속도를 높일 수 있습니까? 관계에서 "상태"속성을 제거하고 노드 (사용자가 아닌 판매자)에 추가하려고했습니다. 그러나 제약 조건이 WHERE victim.status="Disputed" 인 쿼리를 실행하면 쿼리가 아무 것도 반환하지 않습니다. 그래서, 제 경우에는 사람이 하나의 추가 속성 '상태'를 가지고 있습니다. 나는 많은 일을 잘못했다고 생각하지만, 의견에 감사 할 것입니다. 예를 들어

MATCH (victim:person)-[r:HAS_BOUGHT_AT]->(merchant) 
WHERE victim.status = “Disputed” 

은 분쟁중인 거래의 정확한 수를 반환합니다. 무의미한 거래의 수를 별도로 정하는 경우에도 마찬가지입니다. 그러나 병합되면 빈 세트가 생성됩니다.

내 접근 방식에서 실수를 한 경우 어떻게 많은 수의 노드에 대한 쿼리 속도를 높일 수 있습니까? (첫 번째 단계에서는 모든 노드를 통과하지 마십시오). 비슷한 속성을 가진 데이터 세트로 작업 할 예정이지만 약 1 억 명의 사용자가있을 것이므로 추가 속성에 대해 사용자를 인덱싱하고 싶습니다.

답변

1

[편집]

내가 같은 사람이 여러 판매자의 고객이 될 수 추정하기 때문에, 올바른 방법으로하지 않는 것 person 노드의 관계에서 status 속성을 이동.

대신,이 노드와의 관계를 구체화 할 수있는 등, (의는 purchase 레이블을하자) :

(:person)-[:HAS_PURCHASE]->(:purchase)-[:BOUGHT_AT]->(merchant) 

purchase 노드가 status 속성을 가질 수 있습니다. 또한

CREATE INDEX ON :purchase(status) 

, 당신은 새로운 purchase 노드에 time 속성을 넣을 수 있습니다 : 당신은 인덱스를 생성해야합니다.

위의와

, 쿼리가 될 것입니다 : 매우 흥미로운 보이는 몇 가지 문제를 명확히

MATCH (victim:person)-[:HAS_PURCHASE]->(pd:purchase)-[:BOUGHT_AT]->(merchant) 
WHERE pd.status = “Disputed” 
MATCH victim-[:HAS_PURCHASE]->(pu:purchase)-[:BOUGHT_AT]->(othermerchants) 
WHERE pu.status = “Undisputed” AND pu.time < pd.time 
WITH victim, othermerchants, pu ORDER BY pu.time DESC 
RETURN DISTINCT othermerchants.name as suspicious_store, count(DISTINCT pu) as count, collect(DISTINCT victim.name) as victims 
ORDER BY count DES 
+0

합니다. 그러나 사람과 판매자 사이의 예제 전환에는 시간 소인이 지정되고 시간 소인은 나중에 t.time과 r.time과 비교됩니다. 나는 시간을 어떻게 다루어야합니까? 조금 혼란 스럽습니까? – user201411

+0

그래, 내 대답을 수정했습니다. – cybersam