【发布时间】:2015-06-04 00:41:26
【问题描述】:
我有需要转换为 JPQL 的 Neo4j Cypher 请求:
MATCH (p:Person)-[:worksForOrganisation]->
(:Organisation)-[*0..2]->(:Organisation)
-[:possessesResource|:accessesResource|:supportsResource]->(:Software)
<-[:categoryContains]-(c:ResourceCategory)
WHERE id(p)=({personId})
RETURN c
此请求从唯一的Person 开始,标识符为personId。
我们知道此人为一个(在极少数情况下,很多)Organisations 工作。
我们知道每个组织都可以拥有、访问或支持Software 类型的资源。
鉴于不同组织之间可能存在关联,我们希望返回“包含”该人可以使用的Softwares 的ResourceCategories,从而授予他/她使用来自另一个组织。
将其转换为 JPQL 的困难来自:
- (:组织)-[*0..2]->(:组织)
- (:组织)-[:possessesResource|:accessesResource|:supportsResource]->(:软件)
第 1 点:(:Organisation)-[*0..2]->(:Organisation) 表示最多三个“组织”节点之间的可选关系。这个想法是,在找到一个“组织”节点后,我们还对从最多两个其他“组织”开始的所有路径感兴趣,这些“组织”与该人所在的组织相关联。
第 2 点:(:Organisation)-[:possessesResource|:accessesResource|:supportsResource]->(:Software) 表示,找到一个“组织”后,它可以与具有三种关系的“软件”相关联(甚至可以通过多种关系)。
到目前为止我的想法(我知道真的不完整):
@Query("SELECT rc FROM Person p, Organisation o1, Organisation o2, Organisation o3, Software s, ResourceCategory rc " +
"WHERE p.id = :personId " +
"AND o1 MEMBER OF p.worksForOrganisations " +
"AND s MEMBER OF rc.resources")
Set<ResourceCategoryEntity> getCategoriesForPerson(@Param("personId") Long personId);
问题:
- 如何重现 [*0..2] 可选关系?我是否需要在三个请求之间使用 UNION,一个仅包含组织 o1,第二个包含组织 o1 和 o2,最后一个包含组织 o1、o2 和 o3?
- 各种关系能否转换为“AND ((s MEMBER OF o1.possessesResource) OR (s MEMBER OF o1.accessesResource) OR (s MEMBER OF o1.supportsResource r))”?
谢谢!
更新:作为JPQL doesn't support UNION,那么如何重现“可变长度连接”?
【问题讨论】:
-
您说要将其转换为 SQL,然后继续讨论 JPQL。最好决定哪个是你的目标
-
好的,我修正了我的消息,它是 JPQL。