postgresql 在Apache AGE上实现数据库中特定字符和特定项的检索

83qze16e  于 2023-06-29  发布在  PostgreSQL
关注(0)|答案(2)|浏览(140)

我目前正在使用一个代表RPG游戏的数据库。包含字符项目位置节点。这些节点之间的关系表示为“HAS_ITEM”(在字符项目之间)和“VISITED”(在字符位置之间)。
物品按“稀有度”属性分类,该属性的值介于1(普通)和5(传奇)之间。类似地,位置由'Visit_Count'属性量化,指示它们被任何角色访问的频率。
以下是数据库的摘录:

**Characters.csv:**

Character_Id,Name
1,John
2,Mary
3,Bob
4,Alice

**Items.csv**:

Item_Id,Name,Rarity
1,Sword of Valor,5
2,Shield of Hope,4
3,Wand of Sorcery,3
4,Bow of Speed,4
5,Dagger of Stealth,2

**Locations.csv**

Location_Id,Name,Visit_Count
1,Desert of Sands,15
2,Forest of Mysteries,8
3,Castle of Shadows,25
4,Mountain of Trials,10
5,Sea of Silence,5

**HAS_ITEM.csv**

Character_Id,Item_Id
1,1
2,4
3,2
3,3
4,2
4,5

**VISITED.csv**

Character_Id,Location_Id
1,1
1,2
2,3
2,4
2,5
3,1
3,2
3,3
3,4
4,1

以下是我需要帮助的地方:
1.我想过滤并检索所有与任何稀有度4或以上物品有'HAS_ITEM'关系的角色。这些字符还应与至少3个不同位置有“VISITED”关系。对于这些角色中的每一个,我想显示他们的名称、他们拥有的稀有物品的名称以及他们访问过的唯一位置的总数**。
1.结果应按访问的位置总数降序进行**排序。如果多个字符访问了相同数量的位置,则应按其名称的字母升序对它们进行进一步排序。
我试过这个:

MATCH (c:Character)-[:VISITED]->(l:Location)
WITH c, count(DISTINCT l) as visit_count
MATCH (c)-[:HAS_ITEM]->(i:Item)
WHERE i.Rarity >= 4 AND visit_count >= 3
RETURN c.name, i.name, visit_count
ORDER BY visit_count DESC, c.name ASC

但它只为每个字符返回一项:

c.name   | i.name            | visit_count
-------------------------------------------
Bob      | Shield of Hope    | 4
Mary     | Bow of Speed      | 3

我想要一个角色所有符合条件的物品。
有人能帮我构造一个Cypher查询吗?

qoefvg9y

qoefvg9y1#

您应该使用类似collect()的函数对每个字符的项目名称进行分组。因此,要检索一个角色拥有的所有项,可以按如下方式修改查询:

MATCH (c:Character)-[:VISITED]->(l:Location)
WITH c, count(DISTINCT l) as visit_count
MATCH (c)-[:HAS_ITEM]->(i:Item)
WHERE i.Rarity >= 4 AND visit_count >= 3
RETURN c.name, collect(i.name) as items, visit_count
ORDER BY visit_count DESC, c.name ASC

通过这样做,查询将返回一个字符拥有的所有项,而不仅仅是一个项。

mpbci0fu

mpbci0fu2#

我不知道你的问题是否说:输出是一个匹配的单项,我想其他的东西>>>如果是这样,那么我相信你引用了COLLECT函数来将结果聚合到一行中。

MATCH (c:Character)-[:VISITED]->(l:Location)
WITH c, count(DISTINCT l) as visit_count
MATCH (c)-[:HAS_ITEM]->(i:Item)
WHERE i.Rarity >= 4
WITH c, visit_count, COLLECT(i.name) as rare_items
WHERE visit_count >= 3
RETURN c.name, rare_items, visit_count
ORDER BY visit_count DESC, c.name ASC

相关问题