【问题标题】:Labels, properties, or nodes? Cypher/Neo4j标签、属性或节点?密码/Neo4j
【发布时间】:2014-02-13 17:34:01
【问题描述】:

我不能完全判断这是否是一个坏问题,但我认为它有一个明确的答案......

我正在构建我的第一个图形数据库。它将包含对内容的引用的节点。这些节点将连接到术语节点。每个术语节点可以是大约七种类型之一(Person、Organization、Jargon 等)。

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

一个属性似乎是不可能的,因为它需要在查询期间为每个术语访问一个 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: ...})

任何有更多经验/知识的人都可以参与进来吗?非常感谢。

【问题讨论】:

    标签: performance graph neo4j cypher


    【解决方案1】:

    我不确定我是否完全理解您要做什么,但我想回答几点,然后也许您可以详细说明:

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

    使用动态标签不会对索引产生影响,但您只是在写部分关于缓存的内容。密码解析器保留了它之前看到的查询的缓存,因此它不必每次都重新生成查询计划。鉴于您只有有限数量的标签,无论如何您都不会花很长时间缓存所有组合。

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

    标记

    【讨论】:

    • 我可能会为它使用标签,添加它们是为了替换类型属性和类别节点。你是对的,你不能动态添加它们,但也许你只有 7 种类型可以在客户端预先构建查询并选择它们。我认为标签最容易阅读和使用,您也可以将它们用于 Neo4j 浏览器中的可视化锚定。
    • 预构建查询的唯一问题是这些类型要相互结合使用(我希望用户选择返回的术语类型)。 81 个查询(我已经添加了另外两种类型)似乎需要预先编写很多。我绝对同意语法会更简洁。
    猜你喜欢
    • 2014-04-15
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    相关资源
    最近更新 更多