Cypher-запрос для шаблона списка - PullRequest
2 голосов
/ 30 апреля 2020

У меня есть схема, которая выглядит следующим образом:

  1. A customer связана с другим customer с отношением SIMILAR, имеющим similarity score.

    Пример: (c1:Customer)-->(c2:Customer)

  2. Узел Email подключен к каждому customer со связью MAIL_AT со следующими свойствами узла:

 {
     "active_email_address": "a@mail.com",
     "cibil_email_addresses": [
         "b@mail.com", "c@mail.com"
     ]
 }

Пример: (e1:Email)<-[:MAIL_AT]-(c1:Customer)-[:SIMILAR]->(c2:Customer)-[:MAIL_AT]->(e2:Email)

Узел Risk с некоторыми свойствами, связанными с риском (ниже) и связан с customer с отношением HAS_RISK:
  {
    "f0_score": 870.0,
    "pta_score": 430.0
  }
Узел Fraud с некоторыми свойствами, связанными с мошенничеством (ниже) и связан с customer с отношением IS_FRAUD:
  {
    "has_commited_fraud": true
  }

Мои цели :

  1. Чтобы найти клиентов с общими адресами электронной почты (независимо от активного и дополнительного)?

Мое предварительное решение:

MATCH (email:Email)
WITH email.cibil_email_addresses + email.active_email_address AS emailAddress, email
UNWIND emailAddress AS eaddr
WITH DISTINCT eaddr AS deaddr, email
UNWIND deaddr AS eaddress
MATCH (customer:Customer)-[]->(someEmail:Email)
WHERE eaddress IN someEmail.cibil_email_addresses + someEmail.active_email_address
WITH eaddress, COLLECT(customer.customer_id) AS customers
RETURN eaddress, customers

Проблема: Требуется вечность, чтобы выполнить это. Я понимаю, что работа со списками займет некоторое время, но я могу изменить схему (если предлагается). Должен ли я разбить адрес электронной почты на отдельные узлы? Если да, то как мне разбить cibil_email_addresses на разные узлы, поскольку они могут различаться - Должен ли я создать два узла с разными cibil email addresses и соединить их обоих с клиентом с отношением HAS_CIBIL_EMAIL? (Это действительный дизайн схемы) . Также возможно, что active_email_address клиента присутствует в cibil_email_address другого клиента. Я пытаюсь найти синтетическую атаку c. PS: Если есть некоторые APOC, которые могут помочь достичь этого и ниже, предложите пример.

В производстве для данного клиента с email addresses, risk values, similarity score, а также с учетом других клиентов может быть или не быть отмечено с fraud_status, я хочу проверить, является ли этот новый человек попадет в мошенническое кольцо или нет. PS: Если мне нужно использовать любой gds, чтобы решить эту проблему, пожалуйста, предложите с примерами.

Если бы я должен был сделать то же самое упражнение с другим узлом, таким как Address, который может быть частично совпадающим и будет иметь тот же список исторических адресов в списке, каким должен быть мой идеальный подход?

Я знаю, я помечаю кого-то в своем вопросе, но этот человек, похоже, активен только в отношении Cypher в StackOverflow. @ cybersam любая помощь? Спасибо.

1 Ответ

1 голос
/ 30 апреля 2020

Это должно работать:

MATCH (e:Email)
UNWIND (e.cibil_email_addresses + e.active_email_address) AS address
WITH address, COLLECT(e) AS es
UNWIND es AS email
MATCH (email)<-[:MAIL_AT]-(cust)
RETURN address, COLLECT(cust) AS customers

Предложение WITH использует преимущества функции arregating COLLECT для автоматического сбора всех узлов Email, содержащих один и тот же адрес, используя address в качестве ключа группировки.

Вы должны задавать только один вопрос за один раз. У вас есть пара других вопросов внизу. Если вам по-прежнему нужна помощь с ними, пожалуйста, создайте новые вопросы.

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