我想对某些对象应用一些访问检查。 我们定义了几种访问对象的方法。这里有4个其中:是否有可能在MATCH中做出OR或做相同的事情?
- 用户直接分配给所述对象的
- 用户被分配到一个子对象(或儿童的儿童)
- 对象的组织单位是用户的组织的子单元(我们有一个机构单位树)
- 孩子的组织单位是用户的组织单位的孩子
目前,我正在使用此查询(查询的对象类型的ActionPlan和子类型任务):
//Access via AP org unit
START user=node:UserIndex("id:4321")
MATCH (ap:ActionPlan)
WHERE ap.name CONTAINS "ipsum"
MATCH p=(user)-[:ASSIGNED_TO_ORG_UNIT]->(u_ou)-[:PARENT_OF*0..]-> (ap_ou)<-[:ORG_UNIT]-(ap)
RETURN ap
//Access via Task org unit
UNION
START user=node:UserIndex("id:4321")
MATCH (ap:ActionPlan)
WHERE ap.name CONTAINS "ipsum"
MATCH p=(user)-[:ASSIGNED_TO_ORG_UNIT]->(u_ou)-[:PARENT_OF*0..]-> (t_ou)<-[:ORG_UNIT]-(t:Task)<-[:PARENT_OF*1..2]-(ap)
RETURN ap
//Access via AP direct assignment
UNION
START user=node:UserIndex("id:4321")
MATCH (ap:ActionPlan)
WHERE ap.name CONTAINS "ipsum"
MATCH p=(user)<-[:ASSIGNED_USER]-(ap)
RETURN ap
//Access via Task direct assignment
UNION
START user=node:UserIndex("id:4321")
MATCH (ap:ActionPlan)
WHERE ap.name CONTAINS "ipsum"
MATCH p=(user)<-[:ASSIGNED_USER]-(t:Task)<-[:PARENT_OF*1..2]-(ap)
RETURN ap
我能够得到正确的结果,但我不得不重复自己了很多,我不能分页的结果(见https://github.com/neo4j/neo4j/issues/2725)使用极限。
我尝试使用OPTIONAL MATCH。我得到正确的结果,但我还是有很多重复的和较差的性能比联:
START user=node:UserIndex("id:4321")
OPTIONAL MATCH accessViaOuAP=(user)-[:ASSIGNED_TO_ORG_UNIT]->(u_ou1)-[:PARENT_OF*0..]->(ap_ou)<-[:ORG_UNIT]-(ap1:ActionPlan)
WHERE ap1.name CONTAINS "ipsum"
OPTIONAL MATCH accessViaOuTask=(user)-[:ASSIGNED_TO_ORG_UNIT]->(u_ou)-[:PARENT_OF*0..]-> (t_ou)<-[:ORG_UNIT]-(t1:Task)<-[:PARENT_OF*1..2]-(ap2:ActionPlan)
WHERE ap2.name CONTAINS "ipsum"
OPTIONAL MATCH apAssignement = (user)<-[:ASSIGNED_USER]-(ap3:ActionPlan)
WHERE ap3.name CONTAINS "ipsum"
OPTIONAL MATCH taskAssignement = (user)<-[:ASSIGNED_USER]-(t2:Task)<-[:PARENT_OF*1..2]-(ap4:ActionPlan)
WHERE ap4.name CONTAINS "ipsum"
RETURN ap1,ap2,ap3,ap4
而且,我不喜欢在此查询回报。
我想知道如果有一种方法来编写查询或多或少是这样的:
START user=node:UserIndex("id:4321")
MATCH (ap:ActionPlan)
WHERE ap.name CONTAINS "ipsum"
MATCH (user)-[:ASSIGNED_TO_ORG_UNIT]->(u_ou)-[:PARENT_OF*0..]-> (ap_ou)<-[:ORG_UNIT]-(ap)
OR (user)-[:ASSIGNED_TO_ORG_UNIT]->(u_ou)-[:PARENT_OF*0..]-> (t_ou)<-[:ORG_UNIT]-(t:Task)<-[:PARENT_OF*1..2]-(ap)
OR (user)<-[:ASSIGNED_USER]-(ap)
OR (user)<-[:ASSIGNED_USER]-(t:Task)<-[:PARENT_OF*1..2]-(ap)
RETURN ap
首先,感谢您的回答。我尝试过,但问题在于性能。使用UNION或OPTIONAL,我可以在100ms内得到结果。在WHERE模式下,我必须等待超过20秒。 –