Performance 标签、属性或节点?Cypher/Neo4j

Performance 标签、属性或节点?Cypher/Neo4j,performance,graph,neo4j,cypher,Performance,Graph,Neo4j,Cypher,我不知道这是不是一个糟糕的问题,但我认为它有一个明确的答案 我正在建立我的第一个图形数据库。它将保存对内容的引用节点。这些节点将连接到术语节点。每个术语节点可以是七种类型(个人、组织、行话等)中的一种 实现数据库中与查询速度相关的术语类型的最佳方法是什么?用户将根据术语搜索内容,其想法是允许他们根据其类型过滤术语 作为一个属性似乎是不可能的,因为它需要在查询期间为每个术语访问一个JSON对象 (contentNode:content)-[:TAGGED_WITH]-(termNode:term

我不知道这是不是一个糟糕的问题,但我认为它有一个明确的答案

我正在建立我的第一个图形数据库。它将保存对内容的引用节点。这些节点将连接到术语节点。每个术语节点可以是七种类型(个人、组织、行话等)中的一种

实现数据库中与查询速度相关的术语类型的最佳方法是什么?用户将根据术语搜索内容,其想法是允许他们根据其类型过滤术语

作为一个属性似乎是不可能的,因为它需要在查询期间为每个术语访问一个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:physicalObject:jargon:...)
使用动态标签不会对索引产生影响,但您只是部分地写了缓存。cypher解析器保留一个它以前看到的查询缓存,这样它就不必每次都重新生成查询计划。考虑到标签的数量有限,缓存所有组合不会花费很长时间

我建议您使用数据子集尝试各种模型,并测量每个模型的查询时间和查询可读性


马克

我不确定我是否完全理解您的意图,但我想回答几点,然后您可以详细说明:

但标签似乎不能用作密码查询中的动态属性,因为它会阻止 查询未被缓存/正确索引

(contentNode:content)-[:TAGGED_WITH]-(termNode:term:physicalObject:jargon:...)
使用动态标签不会对索引产生影响,但您只是部分地写了缓存。cypher解析器保留一个它以前看到的查询缓存,这样它就不必每次都重新生成查询计划。考虑到标签的数量有限,缓存所有组合不会花费很长时间

我建议您使用数据子集尝试各种模型,并测量每个模型的查询时间和查询可读性


Mark

我可能会为它使用标签,添加标签是为了替换类型属性和类别节点。您是对的,您不能动态添加它们,但可能因为您只有7种类型,所以您可以在客户端预构造查询并只选择它们。我认为标签是最容易阅读和使用的,你也可以在Neo4j浏览器中使用它们进行可视化锚定。预构造查询的唯一问题是,这些类型要相互结合使用(我希望用户选择返回的术语类型)。81个查询(我又添加了两种类型)似乎需要预先编写很多。我当然同意语法会更简洁。我可能会使用标签,它们被添加来替换类型属性和类别节点。您是对的,您不能动态添加它们,但可能因为您只有7种类型,所以您可以在客户端预构造查询并只选择它们。我认为标签是最容易阅读和使用的,你也可以在Neo4j浏览器中使用它们进行可视化锚定。预构造查询的唯一问题是,这些类型要相互结合使用(我希望用户选择返回的术语类型)。81个查询(我又添加了两种类型)似乎需要预先编写很多。我绝对同意语法会更简洁。