2014-09-23 39 views
3

使用Neo4j的2.1.4和SDN 3.2.0.RELEASENeo4j的关系结构中索引

我有与具有与其相关联的UUID关系连接节点的图。外部系统使用UUID作为识别关系来源和目标的手段。在Spring Data Neo4j(SDN)中,我们有一个@RelationshipEntity(type=”LINKED_TO”)类,其中@StartNode,@EndNode和字符串uuid字段。所述uuid字段是@Indexed和作为

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

在Neo4j的所得模式定义显示出来。然而,运行针对数据,例如一个暗号查询

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输出表明该字段的索引在那里 - 我无法使用它。

有没有人有任何建议?

非常感谢,

戴夫

+0

我不明白。你的'uuid'是**节点**属性还是**关系**属性?根据你的模式,你有一个关于':Link(uuid)'的索引,其中'Link'是一个只能存在于**节点**上的标签。但在第二个查询中,您将标签放在**关系旁边(这也解释了您的SyntaxException)。 – 2014-09-23 18:33:41

+0

'uuid'是**关系**属性。我认为,在@RelationshipEntity(type =“LINKED_TO”)public class Link中添加一个'@Indexed(unique = true)String uuid'会导致SDN在(n:Link)上执行'create constraint' assert n.uuid是唯一的,正如你所说,它实际上是在一个标签为'Link'的节点上创建一个约束 - 因此它不起作用。我认为这是SDN中的一个错误 - 它不应该允许在@ @ RelationshipEntity上使用@ Indexed。但是关于如何在“链接”关系上对属性进行索引仍然存在整个问题。 – 2014-09-23 19:43:55

回答

1

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

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

我不知道如何能与SDN一起使用。

备注:要求关系索引几乎总是表示在图数据模型中做错了事。一切都是thing或在您的域中具有身份应该是一个节点。所以如果一个关系需要一个uuid,也许这个关系指的是一个东西,因此应该被转换成一个节点,这个节点与前一个开始节点具有入站关系,并且具有与前一个末端节点的出站关系。