Es gibt Organisationen und Anwendungen innerhalb des Softwaresystems. Benutzeraktionen generieren Protokolldatensätze. Protokollsätze (grün) gehören zu Organisationen (rot) und können zu Anwendungen gehören (pink).Wie nach einem optionalen Beziehungsparameter in der Chiffre zu filtern?
Es besteht ein Bedarf Protokollaufzeichnungen von einem verschiedenen Satz von Parametern (bei Erstellung, Autor, Organisation, etc.) zu filtern. Filtern Sie Protokollsätze nach der Anwendung, zu der sie gehören, und erfassen Sie alle Protokolldatensätze im System, wenn dieser Parameter nicht angegeben ist. Dazu habe ich die folgende Abfrage:
MATCH
(log0:Log)-[:GENERATED_IN]->(org:Organization),
(a1:Application)<-[:GENERATED_IN]-(log1:Log)
WHERE ID(a)=coalesce({applicationID}, ID(a))
RETURN DISTINCT
CASE {applicationID}
WHEN null THEN log0
ELSE log1
END
as result
Da der Parameter optional ist, muss ich mit der Situation umgehen, wenn er nicht angegeben. Ich entschied mich, ID(a)=coalesce({applicationID}, ID(a))
für diesen Fall zu verwenden, was gleich ID(a)=ID(a)
sein wird, falls der applicationID
Parameter nicht angegeben wird (so filtern wir gerade nicht durch diesen Parameter, was ich tatsächlich erreichen würde).
Ich frage mich, ob es eleganter ist, diese Filterung durch optionale Beziehung zu tun. Ich versuchte
MATCH
(a:Application)<-[:GENERATED_IN*0..1]-(log:Log)-[:GENERATED_IN]->(org:Organization)
WHERE ID(a)=coalesce({applicationID}, ID(a))
RETURN
log
Und versuchte auch Abfragen mit OPTIONAL MATCH
, aber ohne Erfolg. Ich würde Vorschläge zur Verbesserung schätzen.
Und BTW, gibt es eine Möglichkeit, Parameter wie {applicationID}
von der Neo4j-Browser-Konsole angeben? Wie <query>, {applicationID}=202175
. Ich ersetze Werte jedes Mal manuell.
"Gibt es eine Möglichkeit, Parameter [...] anzugeben?" Es ist nicht sehr gut beworben, aber es gibt den ': param' Befehl. Siehe https://stackoverflow.com/questions/42397773/neo4j-what-is-the-syntax-to-set-cypher-query-parameters-in-the-browser-interfac –