Neo4j关系模式索引

时间:2014-09-23 18:15:57

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

使用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
...

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

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输出表明索引是针对该字段的 - 我只是不能使用它。

有人有任何建议吗?

非常感谢,

戴夫

1 个答案:

答案 0 :(得分:1)

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

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

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

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