2016-05-12 7 views
0

Ich versuche einige Zugriffsprüfungen auf einige Objekte anzuwenden. Wir haben mehrere Möglichkeiten definiert, um auf ein Objekt zuzugreifen. Hier sind 4 von ihnen:Ist es möglich, ein ODER in einem MATCH zu machen oder etwas Gleichwertiges zu tun?

  • Benutzern direkt zugeordnet zu dem Objekt
  • Benutzer ein Kind zugewiesen werden (oder ein Kind des Kindes) des Objekts
  • Objekt Organisationseinheit ist ein Kind der org des Benutzers Einheit (wir eine Organisationseinheit Baum haben)
  • Organisationseinheit des Kindes ist ein Kind der Organisationseinheit des Benutzers

Derzeit ich diese Abfrage bin mit (der Objekttyp ein-Aktionsplan und das Kind Typ abgefragt Aufgabe):

//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 

Ich bin in der Lage das richtige Ergebnis zu bekommen, aber ich habe mich viel zu wiederholen, und ich kann LIMIT nicht die Ergebnisse verwendet für Paginieren (siehe https://github.com/neo4j/neo4j/issues/2725).

Ich versuchte mit OPTIONAL MATCH. Ich bekomme das richtige Ergebnis, aber ich habe immer noch eine Menge Doppelarbeit und eine schlechtere Leistung als bei 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 

Außerdem mag ich nicht das RETURN in dieser Abfrage.

ich mich gefragt, ob es einen Weg gibt die Abfrage mehr oder weniger wie folgt zu schreiben:

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 

Antwort

0

die Muster in der WHERE Hinzufügen war nicht die Lösung. Es entstand ein riesiges Leistungsproblem: von 100ms bis über 20s.

ich beschlossen, die Beziehungen meines Modells zu ändern, und ich kenne eine allgemeine Zugriffskontrollabfrage, die ich an alle meinen Objekttypen anwenden kann:

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 

Dann wurde auf der Abfrage abhängig ich mich machen möge kann das zu verwendende Label angeben.

0

Nun, was definieren Sie durch more or less möglich ist, genau so, wie Sie geschrieben haben.

Beispiel auf dem Standard-Graphen basierend auf http://console.neo4j.org

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

Zuerst, danke für Ihre Antwort. Ich habe das versucht, aber das Problem ist die Leistung. Mit der UNION oder dem OPTIONAL bekomme ich das Ergebnis in 100ms. Mit den Mustern in der WHERE muss ich mehr als 20 Sekunden warten. –

Verwandte Themen