2016-05-12 5 views
0

いくつかのオブジェクトに対していくつかのアクセスチェックを適用しようとしています。 オブジェクトにアクセスするには、いくつかの方法を定義しました。ここではそれらの4されていますMATCHで論理和をとることができますか?

  • ユーザーが直接
  • ユーザーが子(または子の子)に割り当てられているオブジェクトに割り当てられているオブジェクトの
  • オブジェクトの組織単位は、ユーザーの組織の子でありますユニット(私たちは組織単位ツリーを持っている)
  • 子供の組織単位は、ユーザーの組織単位の子である

現在、私はこのクエリを使用しています(照会オブジェクトタイプは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を参照してください)ページ付けのためにLIMITを使用することはできません。

私はOPTIONAL MATCHを使ってみました。私は、正しい結果を得るが、私はまだ重複やUNIONよりも貧しいパフォーマンスをたくさん持っている:

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 

また、私はこのクエリでRETURNを好きではありません。

このように、多かれ少なかれクエリを記述するための方法がある場合、私は思っていた:

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

におけるデフォルトのグラフに基づいて

例解決策ではありませんでした。これは、100msから20sを超える巨大なパフォーマンス問題を引き起こしました。

私は私のモデルの関係を変更することを決めたと私はすべての私のオブジェクトタイプに適用できる汎用的なアクセスチェッククエリを持って知っている:

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によって定義することは、あなたが書いたとおりに、可能です。 WHEREのパターンを追加http://console.neo4j.org

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

まず、お返事いただきありがとうございます。私はこれを試しましたが、問題はパフォーマンスです。 UNIONまたはOPTIONALを使用すると、結果は100msになります。どこのパターンで、私は20秒以上待たなければなりません。 –

関連する問題