【问题标题】:Neo4J Schema Design QueryNeo4J 模式设计查询
【发布时间】:2023-03-09 14:57:01
【问题描述】:

我正在使用 Neo4J 以图形格式保存 XSD。图中的每个节点都有一个属性,它是字符串的列表(数组)。 我的查询将基于这个数组列表。

例如:为了简单起见,假设图中的每个节点都将具有字母列表作为属性之一。现在我的查询需要在数组列表中产生所有包含“C”的节点。

我的问题是,我是否应该将属性数组列表中的所有字母移动到作为子节点附加到每个节点的单个节点。如果我这样做,我的查询将更改为产生其子节点包含“C”作为其值的所有节点。

以上两种方法哪一种更有效。将属性作为 arraylist 或具有包含 arraylist 的各个值的单独子节点。

在实际场景中,该数组列表可以包含数千个条目。因此,如果我继续使用第二种方法并为每个 arraylist 值创建单独的节点,树的大小将会膨胀。

但我需要知道这两种方法中的 READ 有效方法。

【问题讨论】:

  • 你能解释一下“字母”是什么意思吗?它是一串字符吗?还是只是一个字符(来自英文字母表)?插图或更多细节会有所帮助。
  • This somewhat related question 可能感兴趣。
  • 是的,我已经看过上面的链接了。但我仍然想探索我的选择。
  • 我在上面的例子中使用了字母来保持简单。但在实际用例中,它将是字符串数组。
  • 只是为了总结我的问题,对于搜索/读取查询,拥有不同的节点而不是将属性作为 arraylist 是否很好。哪种方法可以有效地获取我的结果。

标签: graph neo4j graph-databases nosql


【解决方案1】:

我会说这取决于您计划使用的查询。

如果按元素查找是主要用例(如在您的示例中,查找包含“C”的所有节点),则单独的节点可能更有效。原因是您的查询将不是“包含”类型的查询,而是相反,首先匹配子节点“C”(并且您的索引或唯一约束将在引擎盖下用于快速查找),然后遍历从该节点到与其关联的所有节点的关系。您无需进行额外的过滤或属性检查即可获得相关结果。

一个使用示例,假设您有 :Holder 节点和 :Letter 节点,其中 :Letter 节点具有唯一的“字母”属性,并且每个 :Holder 节点都与 :Letter 节点的某个子集具有 :Contains 关系。

您用于获取所有 :Holder 节点包含“C”的查找查询如下所示:

MATCH (:Letter{letter:'c'})<-[:Contains]-(h:Holder)
RETURN h

就是这样。你匹配你想找到的东西,然后你找到包含它的所有其他节点。

另一个选项,在节点中使用列表,尤其是包含数千个条目(和数千个节点)对我来说似乎性能较差。据我所知,索引不涵盖集合的元素,因此您将永远无法通过集合元素进行快速查找,数据库将不得不检查所有节点的集合的所有元素以找到具有该元素的元素,这只会随着集合的增长和节点数量的增长而变慢。

这种用法的示例,其中 :Holder 节点有一个“字母”集合,如下所示:

MATCH (h:Holder)
WHERE 'c' in h.letters
RETURN h

同样,这是一个看起来很简单的查询,但它会很慢,无法利用索引或其他方式来加速它。

也就是说,您计划提出的其他问题也应纳入最终决定的考虑范围内。

【讨论】:

    【解决方案2】:

    对于您的用例,将同一集合中的所有字符串保存在同一节点中应该更快,因为 neo4j 需要做的工作更少。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多