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
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. –