Neo4j:维护节点计数

Neo4j:维护节点计数,neo4j,cypher,Neo4j,Cypher,我正在调查Neo4j的使用情况,以近乎实时地检测潜在的欺诈卡交易。我从我们的在线系统收到一位客户的详细信息和他们刚刚使用的一张卡。我在这里尝试的是为客户和卡创建新节点(如果它们不存在),然后在它们之间建立关系 每当客户使用我要设置的卡的上次使用时间的卡时,另外,如果这是第一次看到此客户-->卡关系,则更新与该客户关联的卡数和与该卡关联的客户数的总数 下面的密码似乎有效,但我认为它会在每次看到关系时重新评估计数,而不仅仅是在创建时。是否可以在此语句中使用ON MATCH和ON CREATE来限制不

我正在调查Neo4j的使用情况,以近乎实时地检测潜在的欺诈卡交易。我从我们的在线系统收到一位客户的详细信息和他们刚刚使用的一张卡。我在这里尝试的是为客户和卡创建新节点(如果它们不存在),然后在它们之间建立关系

每当客户使用我要设置的卡的上次使用时间的卡时,另外,如果这是第一次看到此客户-->卡关系,则更新与该客户关联的卡数和与该卡关联的客户数的总数

下面的密码似乎有效,但我认为它会在每次看到关系时重新评估计数,而不仅仅是在创建时。是否可以在此语句中使用ON MATCH和ON CREATE来限制不必要的处理

MERGE (c:customers {customer_id:"12345678"})
MERGE (a:cards {card_hash:"45uIic..."})
MERGE (c)-[r:has_card]->(a)
set r.last_transaction = "30-NOV-2016 07:58:42"
set a.card_ct = size(()-[:has_card]->(a))
set c.card_count = size((c)-[:has_card]->())

我从Python(使用py2neo)运行这个程序,我还想返回一些东西,让我能够启动基于dijkstra的定制社区搜索。你知道我该如何根据这是新的还是现有的关系返回一些变量吗?

类似的东西怎么样。在匹配项上创建计数器,如果计数器大于零,则它是一个现有关系。否则,这是一种新的关系

MERGE (c:customers {customer_id:"12345678"})
MERGE (a:cards {card_hash:"45uIic..."})
MERGE (c)-[r:has_card]->(a)
ON MATCH SET r.num = coalesce(r.num, 0) + 1
set r.last_transaction = "30-NOV-2016 07:58:42"
set a.card_ct = size(()-[:has_card]->(a))
set c.card_count = size((c)-[:has_card]->())
RETURN 
CASE 
  WHEN r.num > 0 THEN false
  ELSE true
END as new_relationship 

您甚至不需要拥有
card\u ct
card\u count
属性


自neo4j 2.1以来,从节点获取特定类型的关系数非常有效。因此,每次需要计数时,只需使用
大小(()-[:has_card]->(node))
大小((node)-[:has_card]->())
这是我最后得到的密码,感谢Dave Bennett的建议。我还意识到,如果只有一个客户与一张卡关联,我不需要启动任何进一步的分析,所以我也排除了这一点

MERGE (c:customers {customer_id:"12345678"})
MERGE (a:cards {card_hash:"BFgn..."})
MERGE (c)-[r:has_card]->(a)
ON CREATE SET a.card_scheme = "VISA DEBIT"
            , a.card_ct = size(()-[:has_card]->(a))
            , c.card_count = size((c)-[:has_card]->())
ON MATCH SET r.ind = 1
SET r.last_transaction = "06-Dec-2016 11:19:13"
RETURN CASE WHEN exists(r.ind) 
                 AND a.card_ct + c.card_count > 2 
                 THEN false 
                 ELSE true END as new_relationship

我在节点上保留“关系数”属性,以便在Neo4j浏览器中可见。我发现查看与卡(或银行或电话号码…)关联的客户数比查看卡号散列等详细信息更有用。对于客户而言,在尝试扩展节点之前,统计与之关联的卡片等的数量非常有用。您不应基于浏览器中易于可视化的内容设计数据模型。您应该设计它以使您的实际用例高效。您可以按照我建议的方式在浏览器中执行查询,按计数排序结果,并在浏览器中以表格或文本形式查看结果。谢谢,这正是我所需要的。我还意识到,我不应该在每一行上都使用一个新的集合,只要用逗号分隔匹配后的语句就可以了。