使用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输出表明该字段的索引在那里 - 我无法使用它。
有没有人有任何建议?
非常感谢,
戴夫
我不明白。你的'uuid'是**节点**属性还是**关系**属性?根据你的模式,你有一个关于':Link(uuid)'的索引,其中'Link'是一个只能存在于**节点**上的标签。但在第二个查询中,您将标签放在**关系旁边(这也解释了您的SyntaxException)。 – 2014-09-23 18:33:41
'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