在Neo4j中存储文本

时间:2015-12-06 17:37:35

标签: neo4j

我们正在使用Neo4J并喜欢它。我们在其中做各种各样的图形事物。但是,我们所做的一些事情并不是图形化的。例如,我们会记录特定类型节点的所有更改:

(n)-[:CHANGE]->(c1)-[:CHANGE]->(c2) etc etc

此更改列表可以是20或30个c1个节点。虽然看起来很奇怪,但我没有真正的问题。 (当然,我现在更聪明了,因为每个:CHANGE关系都有一个日期,我可以直接从n获得所有c1个节点。但无论如何。)

但是,如果我想存储大量文本或图像,该怎么办?在节点中存储大量数据是否有问题?我可以使用不同的数据库来处理这些事情,但这只会增加运营业务所需的技能。当然,在两个不同的数据库中加入数据总是PITA。

所以我需要担心在单个属性中存储大量文本?我是否需要以上述方式避免创建日志?

1 个答案:

答案 0 :(得分:3)

创建事件的链接列表,无论它们是什么,都可以。它甚至说它是图形的!我们使用这种方法很多,在ChangeFeed的情况下,类似于你正在做的事情。

在Neo4j中,这样的链接列表实际上比"豪猪"更好,因为如果您正在寻找所有更改,您必须遍历所有关系。但在链表中,您不必查看属性来订购它们。事实上,最好的方法是混合方法,如TimeTree

至于存储大量文本或图像,Neo4j并不是最适合它的地方。另一个数据库是最好的,特别是如果这些数据库的数量很大(>数十万)。

但是如果你想将它们存储在Neo4j中,要记住的一件事是Neo4j将在访问单个属性时加载节点/关系的所有属性。因此,为了在Neo4j中使用文本/图像获得良好的性能,我会将它们存储在自己的节点中。这样,只有在真正需要它们时才能加载它们,但在常规遍历期间不能加载它们。

例如:

CREATE (b:BlogPost {title:'Neo4j Rocks', author:'Tony Ennis', date:".."})-[:HAS_BODY]->(:BlogPostBody {content:'..'})