Neo4J 模式设计查询
Neo4J Schema Design Query
我正在使用 Neo4J 以图形格式保存 XSD。图中的每个节点都有一个属性,它是一个字符串列表(数组)。
我的查询将基于此数组列表。
例如:为简单起见,假设图中的每个节点都将字母列表作为属性之一。现在我的查询需要生成数组列表中包含 'C' 的所有节点。
我的问题是,我是否应该将所有字母表从属性数组列表移动到作为子节点附加到每个节点的各个节点。如果我这样做,我的查询将更改为生成其子节点包含 'C' 作为其值的所有节点。
以上两种方式哪种更有效。具有一个属性作为 arraylist 或具有包含 arraylist 的各个值的单独子节点。
在实际情况下,该数组列表可以包含数千个条目。因此,如果我继续使用第二种方法并为每个 arraylist 值创建单独的节点,树的大小就会膨胀。
但我需要知道两者中 READ 的高效方法。
对于您的用例,将所有字符串保存在同一节点的同一集合中应该会更快,因为 neo4j 必须做的工作更少。
我会说这取决于您计划使用的查询。
如果按元素查找是主要用例(如在您的示例中,查找包含 'C' 的所有节点),那么单独的节点可能更有效。原因是你的查询不会是 'contains' 类型的查询,而是相反,首先匹配到子节点 'C' (并且你的索引或唯一约束将在引擎盖下用于快速查找),然后遍历从该节点到与其关联的所有节点的关系。您无需进行额外过滤或 属性 检查即可获得相关结果。
一个用法示例,假设您有 :Holder 节点和 :Letter 节点,其中 :Letter 节点具有独特的 'letter' 属性,并且每个 :Holder 节点与 :Contains 的某些子集有关系:字母节点。
获取所有包含 'C' 的 :Holder 节点的查找查询如下所示:
MATCH (:Letter{letter:'c'})<-[:Contains]-(h:Holder)
RETURN h
就是这样。你匹配到你想找的东西,然后你找到包含它的所有其他节点。
另一个选项,在一个节点内使用一个列表,尤其是有数千个条目(和数千个节点)的列表对我来说似乎性能较差。据我所知,索引不涵盖集合的元素,因此您永远无法通过集合元素进行快速查找,数据库将不得不检查所有节点集合的所有元素以找到具有该元素的元素,这只会随着集合的增长和节点数量的增长而变慢。
此用法的示例,其中:Holder 节点有一个 'letters' 集合,如下所示:
MATCH (h:Holder)
WHERE 'c' in h.letters
RETURN h
同样,这是一个看起来简单的查询,但它会很慢,无法利用索引或其他方式来加快速度。
也就是说,在做出最终决定时还应考虑您计划提出的其他问题。
我正在使用 Neo4J 以图形格式保存 XSD。图中的每个节点都有一个属性,它是一个字符串列表(数组)。 我的查询将基于此数组列表。
例如:为简单起见,假设图中的每个节点都将字母列表作为属性之一。现在我的查询需要生成数组列表中包含 'C' 的所有节点。
我的问题是,我是否应该将所有字母表从属性数组列表移动到作为子节点附加到每个节点的各个节点。如果我这样做,我的查询将更改为生成其子节点包含 'C' 作为其值的所有节点。
以上两种方式哪种更有效。具有一个属性作为 arraylist 或具有包含 arraylist 的各个值的单独子节点。
在实际情况下,该数组列表可以包含数千个条目。因此,如果我继续使用第二种方法并为每个 arraylist 值创建单独的节点,树的大小就会膨胀。
但我需要知道两者中 READ 的高效方法。
对于您的用例,将所有字符串保存在同一节点的同一集合中应该会更快,因为 neo4j 必须做的工作更少。
我会说这取决于您计划使用的查询。
如果按元素查找是主要用例(如在您的示例中,查找包含 'C' 的所有节点),那么单独的节点可能更有效。原因是你的查询不会是 'contains' 类型的查询,而是相反,首先匹配到子节点 'C' (并且你的索引或唯一约束将在引擎盖下用于快速查找),然后遍历从该节点到与其关联的所有节点的关系。您无需进行额外过滤或 属性 检查即可获得相关结果。
一个用法示例,假设您有 :Holder 节点和 :Letter 节点,其中 :Letter 节点具有独特的 'letter' 属性,并且每个 :Holder 节点与 :Contains 的某些子集有关系:字母节点。
获取所有包含 'C' 的 :Holder 节点的查找查询如下所示:
MATCH (:Letter{letter:'c'})<-[:Contains]-(h:Holder)
RETURN h
就是这样。你匹配到你想找的东西,然后你找到包含它的所有其他节点。
另一个选项,在一个节点内使用一个列表,尤其是有数千个条目(和数千个节点)的列表对我来说似乎性能较差。据我所知,索引不涵盖集合的元素,因此您永远无法通过集合元素进行快速查找,数据库将不得不检查所有节点集合的所有元素以找到具有该元素的元素,这只会随着集合的增长和节点数量的增长而变慢。
此用法的示例,其中:Holder 节点有一个 'letters' 集合,如下所示:
MATCH (h:Holder)
WHERE 'c' in h.letters
RETURN h
同样,这是一个看起来简单的查询,但它会很慢,无法利用索引或其他方式来加快速度。
也就是说,在做出最终决定时还应考虑您计划提出的其他问题。