我不太清楚这是否是一个坏问题,但我认为它有一个明确的答案......
我正在构建我的第一个图形数据库。它将保存对内容的引用的节点。这些节点将连接到术语节点。每个术语节点可以是大约七种类型之一(人、组织、行话等)。
在数据库中实现与查询速度相关的术语类型的最佳方法是什么?用户将根据术语搜索内容,其想法是允许他们根据术语的类型过滤术语。
作为一个属性似乎是不可能的,因为它需要在查询期间访问每个术语的 JSON 对象。
(contentNode:content)-[:TAGGED_WITH]-(termNode:term {type: {"people":false,"organizations":false,"physicalObjects":true,"concepts":true,...}}
标签对我来说直观地有意义,因为不同类型实际上只是更具体地标记术语节点。每个术语节点都可以具有标签“术语”以及相关类型。我对此有些困惑,但似乎标签不能用作密码查询中的动态属性,因为它会阻止查询被缓存/正确索引。
(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: ...})
有更多经验/知识的人可以对此发表意见吗? 非常感谢。
我不确定,我完全理解你想要做什么,但我想回答一些要点,然后也许你可以详细说明:
但标签似乎不能用作密码查询中的动态属性,因为它会阻止 查询被缓存/正确索引。
使用动态标签不会对索引产生影响,但您对缓存的看法部分正确。密码解析器会保留之前见过的查询的缓存,这样就不必每次都重新生成查询计划。鉴于您只有有限数量的标签,无论如何,您很快就会缓存所有组合。
我建议使用数据的子集尝试各种模型,并测量每个模型的查询时间和查询可读性。
马克