【发布时间】: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 输出表明该字段存在索引 - 我只是无法使用它。
有人有什么建议吗?
非常感谢,
戴夫
【问题讨论】:
-
我不明白。您的
uuid是 node 属性还是 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