为了澄清,我们假设我有一种关系类型:“连接”。 Connections有一个名为“typeOfConnection”的属性,它可以接受域中的值:
{“GroupConnection”,“FriendConnection”,“BlahConnect”}。
当我查询时,我可能想要限定与这些类型之一的连接。虽然类型不多,但每种属性类型将有数百万个连接。
我是否需要在connection.typeOfConnection
上放置一个索引,以确保不会遍历所有连接?
如果是这样,我一直无法找到一个简单的密码语句来执行此操作。我在文档中看到了一些描述如何在Java中执行此操作的内容,但是我正在使用Py2Neo与Neo进行交互,所以如果有一种密码方式可以做到这一点会很棒。
答案 0 :(得分:3)
这是混合粒度属性图数据模型。完全没问题,但是你需要用中间节点替换你的关系限定符。为此,请将您的关系替换为一个类型节点和两个关系,以便您可以执行索引编制。
您的模型具有粗粒度的图形。相反的极端被称为细粒度粒度,这是RDF模型的基础。使用属性图,如果要打算使用这种粗粒度图,则需要使用节点代替按类型应用标签的关系。
例如,我们假设你有:
MATCH (thing1:Thing { id: 1 })-->(:Connection { type: "group" }),
(group)-->(thing2:Thing)
RETURN thing2
然后,您可以按属性Connection
标记type
标签。
CREATE INDEX ON :Connection(type)
如果您的应用程序需要动态类型的连接来阻止您使用细粒度的粒度,则可以灵活地不键入关系。
无论您做什么,都不要通过在Cypher查询中动态生成类型关系来解决您的问题。这将阻止您的查询模板被缓存并降低性能。您可以键入所有关系,也可以使用我上面建议的中间节点。