Neo4J架构设计查询

时间:2016-12-08 16:19:58

标签: graph neo4j graph-databases nosql

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

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

我的问题是,我是否应该将属性arraylist中的所有字母表移动到作为子节点附加到每个节点的各个节点。如果我这样做,我的查询将更改为产生其子节点包含的所有节点' C'因为它的价值。

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

使用示例,假设您有:持有者节点和:字母节点,其中:字母节点具有唯一的字母'属性和每个:持有者节点有一个:包含与某些子集的关系:字母节点。

您获取所有的查询查询:持有人节点包含' C'看起来像是:

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

那就是它。您匹配要查找的内容,然后找到包含它的所有其他节点。

另一个选项是,使用节点中的列表,尤其是数千个条目(以及数千个节点),对我来说效果似乎不太好。据我所知,索引不包含集合的元素,因此您永远无法通过集合元素进行快速查找,db必须检查所有节点的集合的所有元素以查找具有该元素的元素,随着集合的增长和节点数量的增长,它们才会变慢。

此用法的一个示例,其中:持有人节点有一个&#39;字母&#39;集合,看起来像这样:

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

同样,这是一个简单的查询,但它将是一个缓慢的,无法利用索引或其他方法来加快它。

尽管如此,还应考虑您计划进行的其他查询以作出最终决定。