2016-05-12 27 views
0

我想对某些对象应用一些访问检查。 我们定义了几种访问对象的方法。这里有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 

回答

0

添加图案在WHERE不是溶液。它造成了一个巨大的性能问题:从100ms到20多个。

我决定改变我的模型的关系,我知道有我能将我的所有对象类型的通用访问检查查询:

START user=node:UserIndex("id:8978") 
MATCH p=(user)-[:ASSIGNED_TO_ORG_UNIT|:PARENT_OF|:ORG_UNIT_OF|:ASSIGNED_TO|:CHILD_OF_OBJ*]->(obj) 
WHERE obj.name CONTAINS "ipsum" 
RETURN obj 

然后,根据查询我要让我可以指定要使用的标签。

0

嗯,你通过more or less定义什么是可能的,完全按照你写的。基于默认的图形

实施例在http://console.neo4j.org

MATCH (n:Crew) 
WHERE (n)-[:KNOWS]->(:Matrix) 
OR (n)-[:LOVES]->(:Crew) 
RETURN n 
+0

首先,感谢您的回答。我尝试过,但问题在于性能。使用UNION或OPTIONAL,我可以在100ms内得到结果。在WHERE模式下,我必须等待超过20秒。 –

相关问题