我创建了一些顶点来表示MTG卡.每张牌都有一个名为mana_cost的属性,这是在游戏中使用该卡的成本.值mana_cost存储在字符串中的花括号中.例如,"{G}{G}"表示两个绿色法力,而"{3}{G}{R}"表示您必须支付一个红色法力(R)、一个绿色法力(G)和3个任何 colored颜色 的法力(3).

下面是我添加到图表中的一张生物牌的例子:

SELECT * FROM cypher ('MTG', $$
    CREATE (c:Creature {
        name: 'Slippery Bogle',
        set: 'Ultimate Masters (UMA)',
        card_number: 223, rarity: 'Uncommon',
        mana_cost: '{U/G}',
        artist: 'Jesper Ejsing',
        power: 1, toughness: 1,
        type: 'Beast',
        oracle_text: 'Hexproof (This creature can’t be the target of spells or abilities your opponents control.)',
        flavor_text: 'Ogle the bogle, or goggle the boggle? Doesn’t matter. You weren’t going to catch it anyway.'
})
RETURN c
$$) AS (creature agtype);

如果我想要找到mana_cost小于或等于‘{2}{G}’的牌,并且它可以找到滑行博格尔(它的mana_cost是"{U/G},这意味着它可以是一个绿色或蓝色的法力"),我会怎么做?

推荐答案

以下是一个可能的解决方案:

SELECT * FROM cypher('MTG', $$
    MATCH (c)
    WHERE c.mana_cost CONTAINS 'G'
        AND (toInteger(substring(c.mana_cost, 1, 1)) <= 2
            OR toInteger(substring(c.mana_cost, 1, 1)) IS null)
    RETURN c.name
$$) AS (card agtype);

该查询首先搜索包含角色‘G’的具有法力消耗的生物,以满足至少需要一个绿色法力的生物的要求.然后,它获取第一组花括号(‘{}’)之间的字符,并将字符串转换为整数.如果得到的整数小于或等于2,则匹配.由于其中的字符可能不是数字而是字母,因此搜索还会考虑生成NULL的结果.最后输出满足这些条件的生物的名称.

Postgresql相关问答推荐

PostgreSQL数据文件是否仅在判断点期间写入磁盘?

我无法在过程中提交

PostgreSQL:如何 for each 唯一的客户输入/更新列中的数据,并将其递增1直到表的末尾

PostgreSQL:重新创建主键值以匹配记录计数

PostgreSQL\d命令:有办法只 Select 一列吗?

无法在kubernetes中设置postgres复制

如何使用 Grafana 测量 PostgreSQL 中的复制

如何在postgresql中按时间查询

Nodejs应用程序的node-postgres vs pg-promise

!= 和 <> 运算符有什么区别?

带有 -C 选项的 pg_restore 不会创建数据库

什么是 postgres 超级用户

PostgreSQL 中的 JSON 外键

丢弃顺序和级联

如何在 PostgreSQL 中插入多行

如何正确索引多对多关联表?

如何删除 Postgres 上的所有数据库?

向 Postgres 整数数组添加值

Postgresql varchar 是否使用 unicode 字符长度或 ASCII 字符长度计算?

在 postgres 中插入语句用于没有时区 NOT NULL 的数据类型时间戳,