RedisGraph 中的架构和查询

问题描述

我是图形、RedisGraph 和 Cypher 的新手,这花了我几个小时没有解决

我有用户向其他用户付款。 可以从用户存入付款。 其他一些用户最终可以提取该存款,但也永远无法提取存款。

我最终得到了这个:

val categoricalIndexers = categoricalVariables
  .map(i => new StringIndexer().setHandleInvalid("skip").setInputCol(i)
                .setoutputCol(i+"Index"))

但是在某些时候我需要找到没有提款的交易。

我的两个问题:

  • 什么是更好的架构?
  • 即使您有更好的逻辑,在示例中如何在没有 Withdrawal 边的情况下检索节点?

非常感谢您的帮助! ??‍♂️

解决方法

什么是更好的架构?

我相信您指的是所谓的“图形建模”。基本形式的图建模包括从句子中导出实体和动词

  • 实体 -> 候选标签
  • 动词 -> 候选关系类型

可以从用户处存入付款。其他一些用户最终可以 提取存款,

  • 实体:付款/存款/交易(我假设您可以互换使用)和用户
  • 动词:存款和取款

所以你在这方面做得很好。

关于你的第二个问题。给定两笔交易

(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

应该只返回 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"