我们是否需要对关系属性进行索引以确保Neo4j不会搜索所有关系

时间:2014-08-06 19:05:02

标签: neo4j cypher py2neo

为了澄清,我们假设我有一种关系类型:“连接”。 Connections有一个名为“typeOfConnection”的属性,它可以接受域中的值:

{“GroupConnection”,“FriendConnection”,“BlahConnect”}。

当我查询时,我可能想要限定与这些类型之一的连接。虽然类型不多,但每种属性类型将有数百万个连接。

我是否需要在connection.typeOfConnection上放置一个索引,以确保不会遍历所有连接?

如果是这样,我一直无法找到一个简单的密码语句来执行此操作。我在文档中看到了一些描述如何在Java中执行此操作的内容,但是我正在使用Py2Neo与Neo进行交互,所以如果有一种密码方式可以做到这一点会很棒。

1 个答案:

答案 0 :(得分:3)

这是混合粒度属性图数据模型。完全没问题,但是你需要用中间节点替换你的关系限定符。为此,请将您的关系替换为一个类型节点和两个关系,以便您可以执行索引编制。

您的模型具有粗粒度的图形。相反的极端被称为细粒度粒度,这是RDF模型的基础。使用属性图,如果要打算使用这种粗粒度图,则需要使用节点代替按类型应用标签的关系。

例如,我们假设你有:

MATCH (thing1:Thing { id: 1 })-->(:Connection { type: "group" }),
      (group)-->(thing2:Thing)
RETURN thing2

然后,您可以按属性Connection标记type标签。

CREATE INDEX ON :Connection(type)

如果您的应用程序需要动态类型的连接来阻止您使用细粒度的粒度,则可以灵活地不键入关系。

无论您做什么,都不要通过在Cypher查询中动态生成类型关系来解决您的问题。这将阻止您的查询模板被缓存并降低性能。您可以键入所有关系,也可以使用我上面建议的中间节点。