列表模式的密码查询
Cypher query for list pattern
我有一个如下所示的架构:
一个 customer
链接到另一个 customer
,其关系 SIMILAR
具有 similarity score
.
示例:(c1:Customer)-->(c2:Customer)
一个 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
}
我的目标:
- 要找到具有共同电子邮件地址的客户(不考虑活动和次要)?
我的暂定方案:
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
的节点并将它们连接到具有关系 [=31 的客户=]? (这是有效的模式设计吗)。此外,一个客户的 active_email_address
也有可能出现在其他客户的 cibil_email_address
中。我正在尝试寻找合成身份攻击。 PS:如果有一些 APOC
可以帮助实现这个和下面的目标,请举例说明。
在生产中,对于具有 email addresses
、risk values
、similarity score
的给定客户,以及给定的其他客户可能会或可能不会被标记为 fraud_status
,我想看看这个新人会不会落入诈骗圈。 PS:如果我需要使用任何gds
来解决这个问题,请提供示例。
如果我要对其他一些节点(例如 Address
进行相同的练习,它可能部分匹配并且将在列表中具有相同的历史地址列表,应该是我的理想方法?
我知道,我在我的问题中标记了某人,但那个人似乎只对 Whosebug 上的 Cypher 很活跃。 @cybersam 有什么帮助吗?
谢谢。
这应该有效:
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 function COLLECT
自动收集包含相同地址的所有 Email
节点,使用 address
作为分组键。
你一次只能问一个问题。您在底部还有其他几个问题。如果您仍然需要帮助,请创建新问题。
我有一个如下所示的架构:
一个
customer
链接到另一个customer
,其关系SIMILAR
具有similarity score
.示例:
(c1:Customer)-->(c2:Customer)
一个
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
}
我的目标:
- 要找到具有共同电子邮件地址的客户(不考虑活动和次要)?
我的暂定方案:
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
的节点并将它们连接到具有关系 [=31 的客户=]? (这是有效的模式设计吗)。此外,一个客户的 active_email_address
也有可能出现在其他客户的 cibil_email_address
中。我正在尝试寻找合成身份攻击。 PS:如果有一些 APOC
可以帮助实现这个和下面的目标,请举例说明。
在生产中,对于具有
email addresses
、risk values
、similarity score
的给定客户,以及给定的其他客户可能会或可能不会被标记为fraud_status
,我想看看这个新人会不会落入诈骗圈。 PS:如果我需要使用任何gds
来解决这个问题,请提供示例。如果我要对其他一些节点(例如
Address
进行相同的练习,它可能部分匹配并且将在列表中具有相同的历史地址列表,应该是我的理想方法?
我知道,我在我的问题中标记了某人,但那个人似乎只对 Whosebug 上的 Cypher 很活跃。 @cybersam 有什么帮助吗? 谢谢。
这应该有效:
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 function COLLECT
自动收集包含相同地址的所有 Email
节点,使用 address
作为分组键。
你一次只能问一个问题。您在底部还有其他几个问题。如果您仍然需要帮助,请创建新问题。