Neo4j / Cypher查询基于两个不相关的节点返回一个结果

时间:2013-07-16 00:19:00

标签: neo4j cypher spring-data-neo4j

下面是我的背景的概念性例子:

我有一个名为User的抽象类(包含id属性为String)
我有一个名为User的{​​{1}}子类 我有一个名为FacebookUser

User子类

使用Spring-Data-Neo4j,我将TwitterUser设为User

我创建了一个测试类,以便在图表中插入@NodeEntityFacebookUser
整个井发生=>插入两个节点并具有 _ 类型 _ ,其中包含子类的完全限定名称。
例如:TwitterUser

现在,我想制作这种密码查询:
检索ID = 123 的用户 因此,我必须找到更有效的方法来检查所有用户节点(com.myApp.model.user.FacebookUserFacebookUser的联合),以便找到唯一的相应记录。

我希望找到一种方法告诉cypher这样的事情:
将每个索引与TwitterUser匹配,每个索引匹配FacebookUser,并检查其中的预期节点

但我没有管理。

我当前的查询是:

TwitterUser

这个转换为:

检查图表中的所有节点(我想,根本不高效),然后保留那些以“User”结尾的节目(包括FacebookUser和TwitterUser)并检查右侧@Query("start u=node(*) where has(u.__type__) and u.__type__ =~ '.*User' and has(u.id) and u.id = {0} return u")

在这种情况下,有没有办法只使用索引节点,而不是扫描整个图形?

我在考虑将 _ 类型 _ 属性重命名为父类的完全限定名称的方法。

我们可以使用SDN轻松完成吗?

实际上,由于SDN似乎使用与节点关联的Java类名作为节点的索引名称,因此它只允许处理Facebook和Twitter子类型的一个索引节点:用户索引节点。

1 个答案:

答案 0 :(得分:1)

如果你对类使用@Indexed,你应该得到像TwitterUser等索引,然后你可以使用你的查询。但是,继承方法存在限制,请参阅Spring Data Neo4j - Indexing and Inheritance进行相关讨论。