RedisGraph 中的架构和查询
Architecture and querying in RedisGraph
我是图形、RedisGraph 和 Cypher 的新手,这花了我几个小时才解决。
我有用户向其他用户付款。
可以从用户存入付款。
其他一些用户最终可以提取该存款,但也永远无法提取存款。
我最终得到了这个:
(u:User)-[d:Deposit]->[t:Transaction]<-[w:Withdrawal]-(u:User)
然而在某些时候我需要找到没有取款的交易。
我的 2 个问题:
- 什么是更好的架构?
- 虽然你有更好的逻辑,但示例中没有Withdrawal边缘的节点的检索方式是什么?
非常感谢您的帮助! ♂️
what would be a better architecture?
我相信你指的是所谓的“图形建模”。基本形式的图形建模包括从句子中导出实体和动词
- 实体 -> 候选标签
- 动词 -> 候选关系类型
A payment can be deposited from a user. Some other user can eventually
withdraw that deposit,
- 实体:Payment/Deposit/Transaction(我假设你可以互换使用)和用户
- 动词:存取款
所以你做得很好。
关于你的第二个问题。给定两笔交易
(u1:User {uid:1})-[:Deposit]->(t1:Transaction {tid:1})<-[:Withdrawal]-(u3:User {uid:3})
(u2:User {uid:2})-[:Deposit]->(t2:Transaction {tid:2})
redis:6379> GRAPH.QUERY g "MERGE (u1:User {uid:1})-[:Deposit]->(t1:Transaction {tid:1})<-[:Withdrawal]-(u3:User {uid:3}) MERGE (u2:User {uid:2})-[:Deposit]->(t2:Transaction {tid:2})"
1) 1) "Labels added: 2"
2) "Nodes created: 5"
3) "Properties set: 5"
4) "Relationships created: 3"
5) "Cached execution: 0"
6) "Query internal execution time: 1.920000 milliseconds"
您可以在查询时添加 WHERE NOT
子句
MATCH (u:User)-[d:Deposit]->(t:Transaction)
WHERE NOT ((t)<-[:Withdrawal]-())
RETURN u.uid
应该只有 return uid 为 2
的用户
redis:6379> GRAPH.QUERY g "MATCH (u:User)-[d:Deposit]->(t:Transaction) WHERE NOT ((t)<-[:Withdrawal]-()) RETURN u.uid"
1) 1) "u.uid"
2) 1) 1) (integer) 2
3) 1) "Cached execution: 0"
2) "Query internal execution time: 0.816100 milliseconds"
我是图形、RedisGraph 和 Cypher 的新手,这花了我几个小时才解决。
我有用户向其他用户付款。 可以从用户存入付款。 其他一些用户最终可以提取该存款,但也永远无法提取存款。
我最终得到了这个:
(u:User)-[d:Deposit]->[t:Transaction]<-[w:Withdrawal]-(u:User)
然而在某些时候我需要找到没有取款的交易。
我的 2 个问题:
- 什么是更好的架构?
- 虽然你有更好的逻辑,但示例中没有Withdrawal边缘的节点的检索方式是什么?
非常感谢您的帮助! ♂️
what would be a better architecture?
我相信你指的是所谓的“图形建模”。基本形式的图形建模包括从句子中导出实体和动词
- 实体 -> 候选标签
- 动词 -> 候选关系类型
A payment can be deposited from a user. Some other user can eventually withdraw that deposit,
- 实体:Payment/Deposit/Transaction(我假设你可以互换使用)和用户
- 动词:存取款
所以你做得很好。
关于你的第二个问题。给定两笔交易
(u1:User {uid:1})-[:Deposit]->(t1:Transaction {tid:1})<-[:Withdrawal]-(u3:User {uid:3})
(u2:User {uid:2})-[:Deposit]->(t2:Transaction {tid:2})
redis:6379> GRAPH.QUERY g "MERGE (u1:User {uid:1})-[:Deposit]->(t1:Transaction {tid:1})<-[:Withdrawal]-(u3:User {uid:3}) MERGE (u2:User {uid:2})-[:Deposit]->(t2:Transaction {tid:2})"
1) 1) "Labels added: 2"
2) "Nodes created: 5"
3) "Properties set: 5"
4) "Relationships created: 3"
5) "Cached execution: 0"
6) "Query internal execution time: 1.920000 milliseconds"
您可以在查询时添加 WHERE NOT
子句
MATCH (u:User)-[d:Deposit]->(t:Transaction)
WHERE NOT ((t)<-[:Withdrawal]-())
RETURN u.uid
应该只有 return uid 为 2
的用户redis:6379> GRAPH.QUERY g "MATCH (u:User)-[d:Deposit]->(t:Transaction) WHERE NOT ((t)<-[:Withdrawal]-()) RETURN u.uid"
1) 1) "u.uid"
2) 1) 1) (integer) 2
3) 1) "Cached execution: 0"
2) "Query internal execution time: 0.816100 milliseconds"