การตรวจจับการฉ้อโกงด้วย BigQuery Graph

1. บทนำ

ส่วนหัวการตลาด - การประพฤติมิชอบในฟินเทค

กิจกรรมการฉ้อโกงมักเกี่ยวข้องกับเครือข่ายที่ซ่อนอยู่ของเอนทิตีที่เชื่อมต่อกัน เช่น บัญชีหลายบัญชีที่ใช้อีเมล หมายเลขโทรศัพท์ หรือที่อยู่จริงเดียวกัน ฐานข้อมูลเชิงสัมพันธ์แบบดั้งเดิมอาจมีปัญหาในการค้นหาความสัมพันธ์ที่ซับซ้อนและมีหลายระดับเหล่านี้อย่างมีประสิทธิภาพ

BigQuery Graph ช่วยให้คุณวิเคราะห์เครือข่ายเหล่านี้ในวงกว้างได้โดยใช้ฐานข้อมูลกราฟ คุณสามารถกำหนดกราฟพร็อพเพอร์ตี้ไว้เหนือตาราง BigQuery ที่มีอยู่ และใช้ Graph Query Language (GQL) เพื่อค้นหารูปแบบในข้อมูล

แอปพลิเคชันทั่วไปของเครือข่ายกราฟสำหรับการตรวจจับการฉ้อโกงคือการหยุดคำสั่งซื้อที่มีที่อยู่สำหรับจัดส่งที่เชื่อมโยงกับเครือข่ายการฉ้อโกง หรือการหยุดการชำระเงินที่เป็นของ

ใน Codelab นี้ คุณจะได้สร้างโซลูชันการตรวจจับการฉ้อโกงโดยใช้ BigQuery Graph คุณจะโหลดข้อมูลจาก Cloud Storage, สร้างกราฟพร็อพเพอร์ตี้ และใช้การค้นหากราฟเพื่อระบุการเชื่อมต่อที่น่าสงสัย

สิ่งที่คุณจะได้เรียนรู้

  • วิธีสร้างชุดข้อมูล BigQuery และโหลดข้อมูล
  • วิธีกำหนดกราฟพร็อพเพอร์ตี้โดยใช้ DDL
  • วิธีค้นหากราฟโดยใช้ GQL
  • วิธีใช้การวิเคราะห์กราฟเพื่อตรวจจับการฉ้อโกง

สิ่งที่คุณต้องมี

  • โปรเจ็กต์ Google Cloud ที่เปิดใช้การเรียกเก็บเงินแล้ว
  • สภาพแวดล้อมสมุดบันทึก BigQuery (BigQuery Studio หรือ Colab Enterprise)

ค่าใช้จ่าย

Lab นี้ใช้ทรัพยากร Google Cloud ที่มีการเรียกเก็บเงิน ค่าใช้จ่ายโดยประมาณไม่เกิน $5 โดยสมมติว่าคุณลบทรัพยากรหลังทำเสร็จแล้ว

2. ก่อนเริ่มต้น

เลือกหรือสร้างโปรเจ็กต์ Google Cloud

  1. ในคอนโซล Google Cloud ให้เลือกหรือสร้างโปรเจ็กต์ Google Cloud ในหน้าเครื่องมือเลือกโปรเจ็กต์
  2. ตรวจสอบว่าเปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์ Google Cloud แล้ว ดูวิธีตรวจสอบว่าเปิดใช้การเรียกเก็บเงินแล้วหรือไม่

เลือกสภาพแวดล้อม

คุณจะต้องมีสภาพแวดล้อมสมุดบันทึกเพื่อเรียกใช้ Lab นี้ โดยสามารถใช้ BigQuery Studio หรือ Colab Enterprise

  1. ไปที่หน้า BigQuery ในคอนโซล Google Cloud
  2. คุณจะใช้สมุดบันทึก Python เพื่อเรียกใช้การค้นหากราฟ

เริ่มต้น Cloud Shell

  1. คลิกเปิดใช้งาน Cloud Shell ที่ด้านบนของคอนโซล Google Cloud
  2. ยืนยันการตรวจสอบสิทธิ์โดยทำดังนี้
gcloud auth list
  1. ยืนยันโปรเจ็กต์โดยทำดังนี้
gcloud config get project
  1. ตั้งค่าหากจำเป็นโดยทำดังนี้
export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project $PROJECT_ID

เปิดใช้ API

เรียกใช้คำสั่งนี้เพื่อเปิดใช้ BigQuery API ที่จำเป็น

gcloud services enable bigquery.googleapis.com \
  bigqueryreservation.googleapis.com 

สร้างการจองและการมอบหมาย BigQuery

หากต้องการเรียกใช้การค้นหา GQL คุณต้องมีการจองที่ใช้รุ่น Enterprise หรือ Enterprise Plus โดยสร้างการจองรุ่น Enterprise ที่มีการปรับขนาดอัตโนมัติใน Cloud Shell ดังนี้

# 1. Create a BigQuery Enterprise reservation with 0 baseline slots and 100 max autoscaling slots
bq mk --reservation \
  --project_id=${GCP_PROJECT} \
  --location=US \
  --edition=ENTERPRISE \
  --slots=0 \
  --autoscale_max_slots=100 \
  --ignore_idle_slots=true \
  fraud-reservation

# 2. Assign your Cloud project to the newly created reservation for query execution
bq mk --reservation_assignment \
  --project_id=${GCP_PROJECT} \
  --location=US \
  --reservation_id=fraud-reservation \
  --job_type=QUERY \
  --assignee_type=PROJECT \
  --assignee_id=${GCP_PROJECT}

3. โหลดข้อมูล

ในขั้นตอนนี้ คุณจะสร้างชุดข้อมูล BigQuery และโหลดข้อมูลตัวอย่างจาก Cloud Storage

ข้อมูลตัวอย่างประกอบด้วยไฟล์ CSV หลายไฟล์ที่แสดงสภาพแวดล้อมการค้าปลีกจำลอง ดังนี้

  • customers.csv: ข้อมูลบัญชีลูกค้า
  • emails.csv: อีเมล
  • phones.csv: หมายเลขโทรศัพท์
  • addresses.csv: ที่อยู่จริง
  • customer_emails.csv, customer_phones.csv, customer_addresses.csv: ตารางการลิงก์
  • orders.csv: ประวัติการสั่งซื้อ รวมถึงแฟล็กการฉ้อโกง

สร้างชุดข้อมูล

สร้างชุดข้อมูลชื่อ fraud_demo เพื่อเก็บตาราง

  1. สำหรับ Codelab นี้ เราจะเรียกใช้คำสั่ง SQL คุณสามารถเรียกใช้คำสั่งเหล่านี้ใน BigQuery Studio > SQL Editor หรือใช้คำสั่ง bq query ใน Cloud Shell การค้นหา SQL ใหม่เราจะสมมติว่าคุณใช้ BigQuery SQL Editor เพื่อให้ได้รับประสบการณ์การใช้งานที่ดีขึ้นกับคำสั่งสร้างหลายบรรทัด
CREATE SCHEMA IF NOT EXISTS `fraud_demo` OPTIONS(location="US");

โหลดตาราง

เรียกใช้คำสั่ง SQL ต่อไปนี้เพื่อโหลดข้อมูลจาก Cloud Storage ลงในชุดข้อมูล

LOAD DATA OVERWRITE `fraud_demo.customers`
FROM FILES (
  format = 'CSV',
  uris = ['gs://sample-data-and-media/fraud-demo-data/customers.csv'],
  skip_leading_rows = 1
);

LOAD DATA OVERWRITE `fraud_demo.emails`
FROM FILES (
  format = 'CSV',
  uris = ['gs://sample-data-and-media/fraud-demo-data/emails.csv'],
  skip_leading_rows = 1
);

LOAD DATA OVERWRITE `fraud_demo.phones`
FROM FILES (
  format = 'CSV',
  uris = ['gs://sample-data-and-media/fraud-demo-data/phones.csv'],
  skip_leading_rows = 1
);

LOAD DATA OVERWRITE `fraud_demo.addresses`
FROM FILES (
  format = 'CSV',
  uris = ['gs://sample-data-and-media/fraud-demo-data/addresses.csv'],
  skip_leading_rows = 1
);

LOAD DATA OVERWRITE `fraud_demo.customer_emails`
FROM FILES (
  format = 'CSV',
  uris = ['gs://sample-data-and-media/fraud-demo-data/customer_emails.csv'],
  skip_leading_rows = 1
);

LOAD DATA OVERWRITE `fraud_demo.customer_phones`
FROM FILES (
  format = 'CSV',
  uris = ['gs://sample-data-and-media/fraud-demo-data/customer_phones.csv'],
  skip_leading_rows = 1
);

LOAD DATA OVERWRITE `fraud_demo.customer_addresses`
FROM FILES (
  format = 'CSV',
  uris = ['gs://sample-data-and-media/fraud-demo-data/customer_addresses.csv'],
  skip_leading_rows = 1
);

LOAD DATA OVERWRITE `fraud_demo.orders`
FROM FILES (
  format = 'CSV',
  uris = ['gs://sample-data-and-media/fraud-demo-data/orders.csv'],
  skip_leading_rows = 1
);

4. สร้างกราฟพร็อพเพอร์ตี้

เมื่อโหลดข้อมูลแล้ว คุณก็กำหนดกราฟพร็อพเพอร์ตี้ได้ กราฟพร็อพเพอร์ตี้ประกอบด้วยโหนด (เอนทิตี) และขอบ (ความสัมพันธ์)

ใน Lab นี้ โหนดมีดังนี้

  • ลูกค้า: แสดงผู้ถือบัญชี
  • โทรศัพท์: แสดงหมายเลขโทรศัพท์
  • อีเมล: แสดงอีเมล
  • ที่อยู่: แสดงที่อยู่จริง

ขอบมีดังนี้

  • OwnsPhone: เชื่อมต่อลูกค้ากับโทรศัพท์
  • OwnsEmail: เชื่อมต่อลูกค้ากับอีเมล
  • LinkedToAddress: เชื่อมต่อลูกค้ากับที่อยู่

สร้างกราฟ

เรียกใช้คำสั่ง DDL ต่อไปนี้เพื่อสร้างกราฟชื่อ FraudDemo ในชุดข้อมูล fraud_demo

CREATE OR REPLACE PROPERTY GRAPH fraud_demo.FraudDemo
  NODE TABLES(
    fraud_demo.customers
      KEY(account_id)
      LABEL Customer PROPERTIES(
        account_id,
        name),

    fraud_demo.emails
      KEY(email)
      LABEL Email PROPERTIES(
        email,
        email_type),

    fraud_demo.phones
      KEY(phone_number)
      LABEL Phone PROPERTIES(
        phone_number,
        phone_type),

    fraud_demo.addresses
      KEY(address)
      LABEL Address PROPERTIES(
        address,
        address_type)
  )
  EDGE TABLES(
    fraud_demo.customer_emails
      KEY(account_id, email)
      SOURCE KEY(account_id) REFERENCES customers(account_id)
      DESTINATION KEY(email) REFERENCES emails(email)
      LABEL OwnsEmail PROPERTIES(
        account_id,
        email,
        last_updated_ts),

    fraud_demo.customer_phones
      KEY(account_id, phone_number)
      SOURCE KEY(account_id) REFERENCES customers(account_id)
      DESTINATION KEY(phone_number) REFERENCES phones(phone_number)
      LABEL OwnsPhone PROPERTIES(
        account_id,
        phone_number,
        last_updated_ts),

    fraud_demo.customer_addresses
      KEY(account_id, address)
      SOURCE KEY(account_id) REFERENCES customers(account_id)
      DESTINATION KEY(address) REFERENCES addresses(address)
      LABEL LinkedToAddress PROPERTIES(
        account_id,
        address,
        last_updated_ts)
  );

5. วิเคราะห์เครือข่าย (2 ระดับ)

เปิดสมุดบันทึกใหม่ ใน BigQuery Studio

สร้าง Notebook ใหม่

สำหรับส่วนการแสดงภาพและคำแนะนำของ Codelab นี้ เราจะใช้สมุดบันทึก Google Colab ใน BigQuery Studio ซึ่งจะช่วยให้เราแสดงภาพผลลัพธ์กราฟได้อย่างง่ายดาย

วางโค้ดต่อไปนี้ลงในเซลล์โค้ด

!pip install bigquery-magics==0.12.1

สมุดบันทึกกราฟ BigQuery ได้รับการติดตั้งใช้งานเป็น IPython Magics การเพิ่มคำสั่ง Magic %%bigquery พร้อมฟังก์ชัน TO_JSON จะช่วยให้คุณแสดงภาพผลลัพธ์ได้ตามที่แสดงในส่วนต่อไปนี้ ในขั้นตอนนี้ คุณจะเรียกใช้การค้นหากราฟเพื่อค้นหาการเชื่อมต่ออย่างง่ายระหว่างบัญชี นี่เป็นการค้นหา "2 ระดับ" เนื่องจากจะเดินทาง 2 ระดับจากโหนดเริ่มต้นเพื่อค้นหาโหนดที่เกี่ยวข้อง (เช่น ลูกค้า -> อีเมล -> ลูกค้า)

เราจะเริ่มต้นด้วยการตรวจสอบบัญชีของ Nicole Wade เราต้องการค้นหาบัญชีที่เกี่ยวข้องกับเธอผ่านการเชื่อมต่อ 2 ระดับ

เรียกใช้การค้นหา 2 ระดับ

เรียกใช้การค้นหาต่อไปนี้ในสมุดบันทึก

%%bigquery --graph
GRAPH fraud_demo.FraudDemo
MATCH 
 p=(a:Customer) 
  ( -[e:OwnsEmail|OwnsPhone|LinkedToAddress WHERE e.last_updated_ts < '2025-07-30']- (n) ){2}
WHERE a.account_id IN ("d2f1f992-d116-41b3-955b-6c76a3352657")
  -- Verify the final node in the hop array is a Customer
  AND 'Customer' IN UNNEST(LABELS(n[OFFSET(1)]))

RETURN TO_JSON(p) AS paths

ทำความเข้าใจผลลัพธ์

การค้นหานี้จะดำเนินการดังนี้

  1. เริ่มต้นที่โหนด Customer ที่มี account_id "d2f1f992-d116-41b3-955b-6c76a3352657" (Nicole Wade)
  2. ติดตามขอบ OwnsEmail, OwnsPhone หรือ LinkedToAddress ไปยังโหนดที่เชื่อมต่อ (Phone, Email หรือ Address)
  3. ติดตามขอบจากโหนดที่เชื่อมต่อดังกล่าวกลับไปยังโหนด Customer อื่นๆ
  4. กรองขอบตามการประทับเวลา (last_updated_ts) เพื่อดูสถานะของเครือข่ายในเวลาที่เฉพาะเจาะจง

คุณควรเห็นว่า Zachary Cordova และ Brenda Brown เชื่อมต่อกับ Nicole ผ่านที่อยู่เดียวกัน

6. วิเคราะห์เครือข่าย (4 ระดับ)

ในขั้นตอนนี้ คุณจะขยายการค้นหาเพื่อค้นหาความสัมพันธ์ที่ซับซ้อนมากขึ้น เราจะค้นหาการเชื่อมต่อ4 ระดับ ซึ่งจะช่วยให้เราค้นหาบัญชีที่เชื่อมต่อผ่านเอนทิตีระดับกลางหลายรายการได้ (เช่น ลูกค้า ก -> อีเมล -> ลูกค้า ข -> โทรศัพท์ -> ลูกค้า ค)

นอกจากนี้ เราจะสังเกตว่าเครือข่ายนี้เปลี่ยนแปลงไปอย่างไรเมื่อเวลาผ่านไป

สถานะ "ก่อนหน้า"

ก่อนอื่น เรามาดูเครือข่ายตามที่ปรากฏในวันที่ 30 กรกฎาคม 2025

เรียกใช้การค้นหาต่อไปนี้

%%bigquery --graph
GRAPH fraud_demo.FraudDemo
MATCH p= ANY SHORTEST (a:Customer) 
  ( -[e:OwnsEmail|OwnsPhone|LinkedToAddress WHERE e.last_updated_ts < '2025-07-30']- (n) ){3, 5}(reachable_a:Customer)
WHERE a.account_id IN ("d2f1f992-d116-41b3-955b-6c76a3352657")
  -- Ensure the final node in the dynamic chain is actually a Customer
  AND 'Customer' IN UNNEST(LABELS(n[OFFSET(ARRAY_LENGTH(n) - 1)]))
RETURN 
  TO_JSON(p) AS paths,                   -- Array of all traversed edges
  ARRAY_LENGTH(e) AS hop_count

สถานะ "หลังจาก"

ตอนนี้มาดูกันว่าเครือข่ายมีลักษณะอย่างไร2 สัปดาห์ต่อมา เราจะเรียกใช้การค้นหาเดียวกันแต่ไม่มีข้อจำกัดด้านวันที่

เรียกใช้การค้นหาต่อไปนี้

%%bigquery --graph
GRAPH fraud_demo.FraudDemo
MATCH p= ANY SHORTEST (a:Customer) 
  ( -[e:OwnsEmail|OwnsPhone|LinkedToAddress]- (n) ){3, 5}(reachable_a:Customer)
WHERE a.account_id IN ("d2f1f992-d116-41b3-955b-6c76a3352657")
  -- Ensure the final node in the dynamic chain is actually a Customer
  AND 'Customer' IN UNNEST(LABELS(n[OFFSET(ARRAY_LENGTH(n) - 1)]))

RETURN 
  TO_JSON(p) AS paths,                   -- Array of all traversed edges
  ARRAY_LENGTH(e) AS hop_count

ทำความเข้าใจผลลัพธ์

การนำตัวกรองวันที่ออกจะทำให้คุณค้นหาข้อมูลทั้งชุด คุณจะสังเกตเห็นว่าเครือข่ายเติบโตขึ้นอย่างมาก ตอนนี้ Nicole Wade เป็นส่วนหนึ่งของกลุ่มที่ใหญ่ขึ้นมากและมีการเชื่อมต่อสูง การขยายตัวอย่างรวดเร็วของเครือข่ายที่เชื่อมต่อกันเป็นตัวบ่งชี้ที่ชัดเจนถึงกิจกรรมที่เป็นการฉ้อโกง เช่น กลุ่มการฉ้อโกงที่แชร์ทรัพยากรเมื่อเวลาผ่านไป

7. สร้างรายงานการฉ้อโกง

ในขั้นตอนนี้ คุณจะรวมการวิเคราะห์กราฟกับข้อมูลธุรกิจแบบเดิม (คำสั่งซื้อ) เพื่อสร้างรายงานการฉ้อโกงที่ครอบคลุม คุณจะระบุบัญชีที่มีความเสี่ยงและคำสั่งซื้อที่อาจเป็นการฉ้อโกง

การค้นหานี้ซับซ้อนมากขึ้น โดยใช้ GRAPH_TABLE เพื่อเรียกใช้การค้นหากราฟภายใน SQL มาตรฐาน และคำนวณการเปลี่ยนแปลงขนาดเครือข่าย (diff) ระหว่างสถานะ "ก่อนหน้า" และ "หลังจาก" ที่เราสังเกตเห็นในขั้นตอนก่อนหน้า

เรียกใช้การค้นหารายงานการฉ้อโกง

เรียกใช้การค้นหาต่อไปนี้ในสมุดบันทึก

%%bigquery --graph
WITH num_orders AS (
  SELECT account_id, COUNT(1) AS num_order
  FROM fraud_demo.orders
  WHERE order_time > '2025-07-30'
  GROUP BY account_id
),

orders AS (
  SELECT account_id, order_id, fraud, order_total
  FROM fraud_demo.orders
  WHERE order_time > '2025-07-30'
),

-- Use Quantified Path Patterns to find connections up to 4 hops away
latest_connect AS (
  SELECT 
    account_id, 
    ARRAY_LENGTH(ARRAY_AGG(DISTINCT connected_id)) AS size
  FROM GRAPH_TABLE(
    fraud_demo.FraudDemo
    MATCH (a:Customer)-[:OwnsEmail|OwnsPhone|LinkedToAddress]-{4}(connected:Customer)
    RETURN a.account_id AS account_id, connected.account_id AS connected_id
  )
  GROUP BY account_id
),

prev_connect AS (
  SELECT 
    account_id, 
    ARRAY_LENGTH(ARRAY_AGG(DISTINCT connected_id)) AS size
  FROM GRAPH_TABLE(
    fraud_demo.FraudDemo
    -- Apply the timestamp filter to EVERY edge in the 4-hop chain
    MATCH (a:Customer)
          (-[e:OwnsEmail|OwnsPhone|LinkedToAddress WHERE e.last_updated_ts < '2025-07-30']-(n)){4}
    WHERE 'Customer' IN UNNEST(LABELS(n[OFFSET(3)]))
    RETURN a.account_id AS account_id, n[OFFSET(3)].account_id AS connected_id
  )
  GROUP BY account_id
),

edge_changes AS (
  SELECT account_id, MAX(last_updated_ts) AS max_last_updated_ts
  FROM fraud_demo.customer_addresses
  GROUP BY account_id
)

SELECT
    la.account_id,
    o.order_id,
    la.size AS latest_size,
    COALESCE(pa.size, 0) AS previous_size,
    la.size - COALESCE(pa.size, 0) AS diff,
    nos.num_order,
    o.fraud AS reported_as_fraud,
    o.order_total,

    CASE
      WHEN (la.size - COALESCE(pa.size, 0)) > 10 AND nos.num_order IS NULL THEN "CUSTOMER AT RISK"
      WHEN (la.size - COALESCE(pa.size, 0)) > 10 AND nos.num_order IS NOT NULL AND o.fraud THEN "CONFIRMED FRAUD ORDER"
      WHEN (la.size - COALESCE(pa.size, 0)) > 10 AND nos.num_order IS NOT NULL AND NOT o.fraud THEN "POTENTIAL FRAUD ORDER"
      ELSE ""
    END AS notes
FROM latest_connect la
LEFT JOIN prev_connect pa ON la.account_id = pa.account_id
LEFT JOIN num_orders nos ON la.account_id = nos.account_id
LEFT JOIN orders o ON la.account_id = o.account_id
INNER JOIN edge_changes ec ON la.account_id = ec.account_id
WHERE nos.num_order > 1 OR (la.size - COALESCE(pa.size, 0)) > 10
ORDER BY diff DESC

ทำความเข้าใจผลลัพธ์

รายงานนี้จะแสดงข้อมูลต่อไปนี้

  • account_id: รหัสของบัญชีที่กำลังวิเคราะห์
  • order_id: รหัสคำสั่งซื้อล่าสุด
  • latest_size: ขนาดของเครือข่ายที่เชื่อมต่อกันในปัจจุบัน
  • previous_size: ขนาดของเครือข่ายเมื่อ 2 สัปดาห์ที่แล้ว
  • diff: การเติบโตของขนาดเครือข่าย
  • num_order: จำนวนคำสั่งซื้อล่าสุด
  • reported_as_fraud: คำสั่งซื้อได้รับการติดแฟล็กเป็นการฉ้อโกงหรือไม่
  • order_total: จำนวนเงินทั้งหมดของคำสั่งซื้อ
  • notes: สถานะความเสี่ยงที่คำนวณตามการเติบโตของเครือข่ายและประวัติการสั่งซื้อ

คุณจะเห็นบัญชีที่มีค่า diff สูงและยอดรวมคำสั่งซื้อสูง ซึ่งเป็นผู้สมัครที่เหมาะสมสำหรับการตรวจสอบเพิ่มเติม หมายเหตุ "ลูกค้ามีความเสี่ยง" และ "คำสั่งซื้อที่อาจเป็นการฉ้อโกง" ช่วยจัดลำดับความสำคัญของบัญชีเหล่านี้

8. การตรวจจับในวงกว้าง

ในขั้นตอนการวิเคราะห์ขั้นสุดท้ายนี้ คุณจะแสดงภาพเครือข่ายในวงกว้าง แทนที่จะเริ่มต้นด้วยบัญชีเดียว คุณจะค้นหาการเชื่อมต่อระหว่างชุดบัญชีที่น่าสงสัย

ซึ่งจะช่วยให้คุณเห็นว่าการตรวจสอบอิสระหลายรายการเป็นส่วนหนึ่งของกลุ่มการฉ้อโกงที่ใหญ่ขึ้นกลุ่มเดียวกันหรือไม่

เรียกใช้การค้นหาที่ปรับขนาด

เรียกใช้การค้นหาต่อไปนี้ในสมุดบันทึก

%%bigquery --graph
GRAPH fraud_demo.FraudDemo
MATCH
p= ANY SHORTEST (a:Customer) 
  ( -[e:OwnsEmail|OwnsPhone|LinkedToAddress]- (n) ){3, 5}
(reachable_a:Customer)
-- these IDs are from the previous results
WHERE a.account_id in (   "845f2b14-cd10-4750-9f28-fe542c4a731b"
  , "3ff59684-fbf9-40d7-8c41-285ade5002e6"
  , "8887c17b-e6fb-4b3b-8c62-cb721aafd028"
  , "03e777e5-6fb4-445d-b48c-cf42b7620874"
  , "81629832-eb1d-4a0e-86da-81a198604898"
  , "845f2b14-cd10-4750-9f28-fe542c4a731b",
   "89e9a8fe-ffc4-44eb-8693-a711a3534849"
 )
 LIMIT 400
RETURN TO_JSON(p) as paths

ทำความเข้าใจผลลัพธ์

การค้นหานี้จะแสดงกราฟที่ซับซ้อนซึ่งแสดงให้เห็นว่าบัญชีที่น่าสงสัยที่ระบุมีการทับซ้อนและแชร์ทรัพยากรกันอย่างไร ตอนนี้คุณกำลังดูการตรวจจับการฉ้อโกงในวงกว้าง ซึ่งระบุคลัสเตอร์ของกิจกรรมที่อาจต้องมีการตอบสนองที่ประสานกัน

9. ล้าง

หากต้องการหลีกเลี่ยงการเรียกเก็บเงินกับบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ใน Codelab นี้ คุณควรลบชุดข้อมูลและกราฟพร็อพเพอร์ตี้

เรียกใช้คำสั่ง SQL ต่อไปนี้เพื่อล้างสภาพแวดล้อม

DROP PROPERTY GRAPH IF EXISTS fraud_demo.FraudDemo;
DROP SCHEMA IF EXISTS fraud_demo CASCADE;

10. ขอแสดงความยินดี

ยินดีด้วย คุณได้สร้างโซลูชันการตรวจจับการฉ้อโกงโดยใช้ BigQuery Graph เรียบร้อยแล้ว

โดยคุณได้เรียนรู้วิธีต่อไปนี้

  • โหลดข้อมูลจาก Cloud Storage ลงใน BigQuery
  • กำหนดกราฟพร็อพเพอร์ตี้โดยใช้ DDL
  • ค้นหากราฟโดยใช้ GQL เพื่อค้นหาความสัมพันธ์อย่างง่ายและซับซ้อน
  • รวมการวิเคราะห์กราฟกับข้อมูลธุรกิจเพื่อระบุความเสี่ยง
  • แสดงภาพเครือข่ายในวงกว้าง

แหล่งข้อมูลเพิ่มเติม