Neo4J 图形数据库中关系属性的更快检索

Posted

技术标签:

【中文标题】Neo4J 图形数据库中关系属性的更快检索【英文标题】:Faster retrieval of relationship properties in Neo4J graph database 【发布时间】:2014-04-22 03:51:06 【问题描述】:

在我的数据模型中,我使用主题标签对用户进行陈述,每个主题标签都变成了node,它们的共同出现是它们之间的relationship。对于我需要考虑的每一种关系:

创建它的用户rel.user 属性 创建时间 - rel.timestamp 属性 创建它的上下文 - rel.context 属性 它的声明 - rel.statementproperty

现在,Neo4J 不允许关系属性索引,因此当我进行需要检索和评估这些属性的搜索时,需要很长时间。具体来说,当我执行此类 Cypher 请求时:

MERGE hashtag1-[rel:TO 
context:"deb659c0-a18d-11e3-ace9-1fa4c6cf2894",
statement:"824acc80-aaa6-11e3-88e3-453baabaa7ed",
user:"b9745f70-a13f-11e3-98c5-476729c16049"]->hashtag2 
ON CREATE 
SET 
rel.uid="824f6061-aaa6-11e3-88e3-453baabaa7ed",
rel.timestamp="13947117878770000";

此请求首先检查是否与这些属性有关系,如果有,它不会做任何事情,但如果没有,它将添加一个新的(具有唯一 ID 和时间戳)。因此,由于必须对每个关系进行评估——而且它们没有被索引——这个请求需要很长时间才能通过。现在我遇到了这样的请求的问题,因为我在一个查询中处理大约 100 个节点和 300 个关系(上面的只有一种类型,还有一些其他的添加到查询中,但上面的那些是最多的贵的)。

因此实际问题:

是否有人知道保留这些关系属性并以某种方式使它们更快工作的好方法,以便在需要时更快地检索和评估它们?或者你认为我应该使用不同类型的请求(如果是,哪个?)

谢谢!

【问题讨论】:

【参考方案1】:

这在我看来几乎就像你的关系实际上应该是一个节点,然后将连接到节点:

上下文 用户 声明 标签1 标签2 标签N

然后你可以有合理的合并选项(例如在 UID 上合并)。

目前,您在关系中失去了图模型的力量。

这也在电子邮件域一章的graph-databases book 中进行了讨论。

【讨论】:

谢谢,但在不改变我使用的模型的情况下,我有哪些选择? 问题是,是的,我也可以更改图形模型,但是如果没有软件,它就会变得无法管理 - 内部 Neo4J viz 之类的工具将无法工作,因为当超过 20 个时它已经阻止了所有内容要显示的节点,在这种情况下,甚至在 1 个用户的 1 个语句中的 1 个上下文中添加 3 个概念节点都需要我创建至少 14 个具有 28 个关系的节点。如果我想在 1 个上下文中添加 100 个节点,包含 1 个语句和 1 个用户怎么办?我会得到一个包含数千个节点甚至更多边的图表,只是为了代表那件事...... 使用 Neo4J 数据库的全部意义(对我来说)是有一种记录数据的方式更接近它的显示方式。如果我开始创建一层又一层的抽象,我还不如回到旧的 mysql - 类似问题的写入速度比上面快很多倍,数据结构超级简单:见textexture.com 【参考方案2】:

您的 hashtag1 和 hashtag2 节点是否已经可用?

如果是,有多少个rels在这些之间已经存在?

为此,Cypher 必须做的是检查其中的每一个关系并比较所有 3 个属性(我不确定它们是否适合 shortstring storage),所以它们有如果它们不在缓存中,则加载。您可以检查您的存储文件,如果您有一个大的字符串存储文件,那么这些 uid 可能不适合属性记录并且必须单独加载。

您的服务器的内存配置是什么(堆和 mmio)?

所有这些加起来。

【讨论】:

嗨迈克尔,我不知道如何检查它,但运行 java -XX:+PrintFlagsFinal -version | grep HeapSize 给了我〜500Mb的初始堆大小和最大〜800。但是现在我的服务器的 RAM 被限制为 1GB。这是你问的吗? [...] hashtag1 和 hashtag2 是在请求​​之前通过 MERGE 操作创建(或匹配)的。它们之间的关系可以从 3 个(最小,如果存在边缘)到数百个关系(将来,随着数据库的增长)。 [...] 我在哪里查看存储文件? [...] 谢谢! 请发布您的messages.log,其中包含配置和内存使用情况以及存储文件大小信息。

以上是关于Neo4J 图形数据库中关系属性的更快检索的主要内容,如果未能解决你的问题,请参考以下文章

图形数据库neo4j

NEO4j简单入门

Neo4j 第二篇:图形数据库

关于neo4j初入门

(1.1)——图形数据库neo4j安装

(1.1)——图形数据库neo4j安装