我目前正在使用一个代表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查询吗?
2条答案
按热度按时间qoefvg9y1#
您应该使用类似
collect()
的函数对每个字符的项目名称进行分组。因此,要检索一个角色拥有的所有项,可以按如下方式修改查询:通过这样做,查询将返回一个字符拥有的所有项,而不仅仅是一个项。
mpbci0fu2#
我不知道你的问题是否说:输出是一个匹配的单项,我想其他的东西>>>如果是这样,那么我相信你引用了COLLECT函数来将结果聚合到一行中。