




// 创建账户实体节点(含属性索引)GRAPH.QUERY Financial "CREATE INDEX ON :Account(id)CREATE (:Account {id: 'A1', risk_level:3, balance:50000}),(:Account {id: 'A2', risk_level:1, balance:150000}),(:Account {id: 'A3', risk_level:5, balance:2000})"// 创建交易关系(含时序和金额属性)GRAPH.QUERY Financial "MATCH (a:Account {id:'A1'}), (b:Account {id:'A2'})CREATE (a)-[:TRANSFER {timestamp: 1628000000, amount: 5000, currency:'USD'}]->(b)"
GRAPH.QUERY Financial "MATCH (a1)-[t1:TRANSFER]->(a2),(a2)-[t2:TRANSFER]->(a3),(a3)-[t3:TRANSFER]->(a1)WHERE t1.timestamp < t2.timestamp < t3.timestampAND t1.amount + t2.amount + t3.amount > 100000RETURN a1.id, a2.id, a3.idORDER BY t3.timestamp DESCLIMIT 10"
GRAPH.EXPLAIN Financial "MATCH (a:Account)-[t:TRANSFER]->()WHERE a.risk_level > 4AND t.amount > 50000RETURN COUNT(*)"/* 输出:1. Project2. Aggregate3. Filter4. Conditional Traverse5. Node By Label Scan*/
GRAPH.EXPLAIN Financial "MATCH (a:Account)-[t:TRANSFER]->()WHERE t.amount > 50000AND a.risk_level > 4RETURN COUNT(*)"/* 优化后计划:1. Project2. Aggregate3. Conditional Traverse4. Filter5. Node By Label Scan*/
GRAPH.QUERY Financial "CREATE INDEX FOR (a:Account)-[t:TRANSFER]->(b:Account)ON (a.risk_level, t.amount, b.risk_level)"
| 数据规模 | 无索引(ms) | 复合索引(ms) ||----------|------------|--------------|| 10万交易 | 1200 | 45 || 百万交易 | 超时 | 220 |
import redisfrom redisgraph import Graphr = redis.Redis()graph = Graph('Financial', r)# 创建流消费者组r.xgroup_create('transfers', 'fraud_team', id='0', mkstream=True)# 实时处理交易流while True:transfers = r.xreadgroup('fraud_team', 'consumer1',{'transfers': '>'}, count=1)for transfer in transfers[0][1]:_, data = transfergraph.query("""MATCH (a {id: $from}), (b {id: $to})CREATE (a)-[:TRANSFER {amount: $amt,timestamp: $ts}]->(b)""", params=data)# 实时检测规则graph.query("""MATCH (a)-[t1]->(b)-[t2]->(c)-[t3]->(a)WHERE t1.timestamp > now()-3600AND t1.amount + t2.amount + t3.amount > 200000RETURN a.id, path""")
# redis.confgraph.maxmemory 10GBgraph.memory_allocator jemallocgraph.cache_threshold 0.3graph.persistence_mode hybrid
| 数据访问模式 | 纯内存(ops/sec) | 混合存储(ops/sec) ||--------------|-----------------|-------------------|| 全热数据 | 45000 | 42000 || 30%冷数据 | 45000 | 39000 || 70%冷数据 | 45000 | 21000 |
# 节点配置redis-server --port 7000 --cluster-enabled yesredis-server --port 7001 --cluster-enabled yesredis-server --port 7002 --cluster-enabled yes# 数据分片策略redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002
GRAPH.QUERY Financial "MATCH ()-[r:TRANSFER]->() RETURN count(r)"/*分片前:单节点1亿数据查询耗时12.3秒分片后:3节点集群查询耗时4.1秒*/
模式设计阶段优先建立必要的属性索引。 对高频查询使用参数化形式避免重复解析。 定期执行GRAPH.PROFILE分析查询热点。 对时序数据配置自动过期策略(TTL)。 结合RedisStream实现复杂事件处理(CEP)。

文章转载自老王两点中,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




