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



为了澄清,让我们假设我有一个关系类型:"connection "。Connections有一个名为"typeOfConnection"的属性,它可以接受域内的值:

{"GroupConnection", "FriendConnection", "BlahConnect"}。

当我查询时,我可能想用这些类型之一来限定连接。虽然没有很多类型,但每种属性类型都有数百万个连接。

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

如果是这样,我一直无法找到一个简单的密码语句来做到这一点。我在文档中看到了一些描述如何在Java中做到这一点的东西,但我使用Py2Neo与Neo交互,所以如果有一种加密的方式来做到这一点,那就太好了。

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

您的模型具有具有粗粒度粒度的图。与之相反的极端称为细粒度,它是RDF模型的基础。对于属性图,如果你要做这种粗粒度的图,你需要使用节点来代替那些根据类型应用标签的关系。

例如,假设您有:

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

则可以通过属性type对标签Connection进行索引。

CREATE INDEX ON :Connection(type)

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

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

最新更新