【问题标题】:Neo4j Relationship Schema IndexesNeo4j 关系模式索引
【发布时间】:2014-09-23 18:15:56
【问题描述】:

使用 Neo4j 2.1.4 和 SDN 3.2.0.RELEASE

我有一个图表,它将节点与具有关联的 UUID 的关系连接起来。外部系统使用 UUID 作为识别关系的来源和目标的手段。在 Spring Data Neo4j (SDN) 中,我们有一个 @RelationshipEntity(type=”LINKED_TO”) 类,其中包含一个 @StartNode@EndNode 和一个字符串 uuid 字段。 uuid 字段为 @Indexed,Neo4j 中生成的架构定义显示为

neo4j-sh (?)$ SCHEMA
==> Indexes
...
==>   ON :Link(uuid) ONLINE
...

但是,对数据运行密码查询,例如

MATCH ()-[r:LINKED_TO]->() WHERE uuid=’XXXXXX’ RETURN r;

对数据库进行全面扫描,需要很长时间

如果我尝试通过运行来使用索引

MATCH ()-[r:LINKED_TO]->() USING INDEX r:Link(uuid) WHERE uuid=’XXXXXX’ RETURN r;

我明白了

SyntaxException: Type mismatch: expected Node but was Relationship.

据我了解,关系应该是 Neo4j 中的一等公民,但我看不出如何利用关系上的索引来防止图形等价于表扫描用于定位关系的数据库。

我知道有How to use relationship index in Cypher这样的帖子问类似的事情,但是这个链接两个节点之间的关系。如果我将链接转换为节点,我们将创建一个节点来表示关系,当我们在图形数据库中工作时这似乎是错误的——我最终会用()-[:xxx]->(:Link)-[:xxx]->() 来表示一个关系。纯粹是因为链接不能表示为关系,这会使模型变得混乱。

Link 附有一个唯一的共享密钥,我想使用它。 Schema 输出表明该字段存在索引 - 我只是无法使用它。

有人有什么建议吗?

非常感谢,

戴夫

【问题讨论】:

  • 我不明白。您的 uuidnode 属性还是 relationship 属性?根据您的架构,您在:Link(uuid) 上有一个索引,其中Link 是一个只能存在于节点 上的标签。但是在您的第二个查询中,您将标签放在 relationship 旁边(这也解释了您的 SyntaxException)。
  • uuid 是一个关系属性。我认为存在一些混淆,因为在@RelationshipEntity(type="LINKED_TO") public class Link 上添加@Indexed(unique=true) String uuid; 会导致SDN 执行create constraint on (n:Link) assert n.uuid is unique,正如您所说,这实际上是在带有标签Link 的节点上创建约束 - 因此它为什么不这样做工作。我认为这是 SDN 中的一个错误 - 它不应该允许在 @RelationshipEntity 上使用 @Indexed。但是关于如何索引Link 关系上的属性仍然存在整个问题。

标签: neo4j graph-databases spring-data-neo4j


【解决方案1】:

架构索引仅适用于节点。索引关系的唯一方法是使用旧索引或自动索引。遗留索引需要在START 子句中显式使用:

START r=relationship:my_index_name(uuid=<myuuid>)
RETURN r

我不确定如何将它与 SDN 结合使用。

旁注:需要关系索引几乎总是表明您的图形数据模型中有问题。 thing 或在您的域中具有身份的所有内容都应该是一个节点。因此,如果一个关系需要一个 uuid,那么该关系可能是指一个事物,因此应该转换为一个与前一个起始节点具有入站关系并与前一个结束节点具有出站关系的节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多