我不能确定这是一个不好的问题,但我认为它有一个明确的答案......
我正在构建我的第一个图形数据库。它将保存对内容的引用的节点。这些节点将连接到术语节点。每个术语节点可以是大约七种类型之一(人物,组织,术语等)。
在查询速度方面,实现数据库中术语类型的最佳方法是什么?用户将根据条款搜索内容,其目的是允许他们根据类型过滤术语。
由于属性似乎不可能,因为它需要在查询期间为每个术语访问JSON对象。
(contentNode:content)-[:TAGGED_WITH]-(termNode:term {type: {"people":false,"organizations":false,"physicalObjects":true,"concepts":true,...}}
标签直观地对我有意义,因为不同的类型实际上只是更具体地标记术语节点。每个术语节点可以具有标签“term”以及相关类型。我对此有些困惑,但似乎标签不能在cypher查询中用作动态属性,因为它会阻止查询被缓存/正确编入索引。
(contentNode:content)-[:TAGGED_WITH]-(termNode:term:physicalObject:jargon:...)
我能想到的最后一个选项是为每个术语'类型'建立一个节点,并将该术语连接到相关的类型节点。现在,这似乎是最好的选择(尽管是最冗长的)。
(contentNode:content)-[:TAGGED_WITH]-(termNode:term)-[:IS_TYPE]-(typeNode:termType {name:jargon}), (termNode:term)-[:IS_TYPE]-(typeNode:termType {name:physical object}), (termNode:term)-[:IS_TYPE]-(typeNode:termType {name: ...})
任何拥有更多经验/知识的人都可以参与其中吗?非常感谢。
答案 0 :(得分:4)
我不确定我是否完全明白你想要做什么,但我想回答几点,然后你可以详细说明:
但似乎标签不能在cypher查询中用作动态属性,因为它可以防止 来自缓存/正确索引的查询。
使用动态标签不会对索引产生影响,但您可以部分写入缓存。密码解析器保留了之前看到的查询缓存,因此每次都不必重新生成查询计划。鉴于您只有有限数量的标签,所以无论如何你都不需要很长时间才能缓存所有组合。
我建议使用您的数据子集尝试各种模型,并测量查询时间和时间。查询每个的可读性。
标记