Neo4j:维护节点数

时间:2016-12-02 14:48:50

标签: neo4j cypher

我正在研究使用Neo4j近乎实时地检测潜在的欺诈性卡交易。我收到了客户的详细信息以及他们刚从我们的在线系统中使用过的卡片。我在这里尝试做的是为客户和卡创建新的节点(如果它们不存在),然后建立它们之间的关系。

每当客户使用该卡时,我想设置卡上次使用的时间,此外,如果这是第一次看到此客户 - >卡片关系,请更新卡片总数客户与卡相关联并且与卡相关联的客户数量。

下面的Cypher似乎有效,但我认为每次看到关系时它都会重新评估计数,而不仅仅是创建。是否可以在此语句中使用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的邻居搜索。任何想法我是如何根据这是一个新的或现有的关系返回一些变量?

3 个答案:

答案 0 :(得分:3)

您甚至不需要拥有float rotate = 0; rotate += (sprite.getRotation() - 40) * Gdx.graphics.getDeltaTime(); if(Math.abs(rotate) > 10) // change the number to set the rotation power cap { rotate = -10; } sprite.rotate(rotate); card_ct属性。

从neo4j 2.1开始,从节点获取特定类型的关系数量是非常有效的。因此,每次需要统计时,只需使用card_countSIZE(()-[:has_card]->(node))

答案 1 :(得分:0)

这样的事情怎么样?在MATCH上创建一个计数器,如果计数器大于零,那么它就是一个现有的关系。否则这是一种新的关系。

apt-get install ruby-dev

答案 2 :(得分:0)

这是我最终得到的Cypher,感谢Dave Bennett的建议。我还意识到如果只有1个客户与1张卡相关联,我就不需要进行任何进一步的分析,因此我也将其排除在外。

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