Neo4J标签与节点属性



我正在学习neo4j,作为一个测试项目,我将我的所有角色都映射了我的所有角色,并从dev.battle.net中检索到的所有角色。

明显的标签是性格和行会,但其他一些很难说。每个角色都有一个类,每个类都有2-4个专业,每个专业都填补了3个角色之一(坦克,治疗师,伤害(。

我的测试查询是...

  • 在公会" ABC"中找到所有坦克。
  • 在" def"领域上找到所有德鲁伊(类(。
  • 找到与" Ghi"同一行为中的所有字符。

我的假设是,角色,专业化,阶级和领域也应为标签,并附有与关系的具体细节。

MATCH (:Tank)-[:RoleFor]->(s:Spec)<-[h:Has]-(c:Character)-[:Member]->(g:Guild)
WHERE h.ItemLevel > 900 and g.Name like 'TestGuild1'
RETURN c,h,s

而不是...

MATCH (c:Character)
Where (c.Class like "Druid" and c.Spec3ItemLevel > 900) Or (c.Class like "Death Knight" and c.Spec1ItemLevel > 900)
return c

i think 第一个第一个会更快,除非它必须加载来自 (:Spec)<-[]-(:Character)的所有关系才能将它们过滤掉。从查询的角度来看,它至少看起来更干净。谁能确认这一点?

如果我们假设您的两个示例(其中包含一些语法错误:like不是Cypher操作员(代表了您所有用例。您只需要添加适当的索引(或唯一性约束(即可避免扫描大量数据以启动您的查询。

这里是与您的两个示例相对应的修改后查询:

MATCH (:Tank)-[:ROLE_FOR]->(s:Spec)<-[h:HAS_SPEC]-(c:Character)-[:MEMBER_OF]->(g:Guild)
WHERE h.itemLevel > 900 AND g.name = 'TestGuild1'
RETURN c, h, s;
MATCH (s:Spec)<-[h:HAS_SPEC]-(c:Character)-[:HAS_CLASS]->(cl:Class)
WHERE s.spec3ItemLevel > 900 AND cl.name IN ['Druid', 'Death Knight']
RETURN c;

您可能应该有至少的索引:

  • :Guild(name)
  • :Class(name)
  • :Spec(spec3ItemLevel)

相关内容

  • 没有找到相关文章

最新更新