2017-11-13 1 views
2

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?

Neo4j DB model

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.

+1

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

Antwort

1

Statt coalesce, könnten Sie IS NULL verwenden und prüfen, ob die Parameter zur Verfügung gestellt wurden:

MATCH 
    (log0:Log)-[:GENERATED_IN]->(org:Organization), 
    (a1:Application)<-[:GENERATED_IN]-(log1:Log) 
WHERE {applicationID} IS NULL 
    OR ID(a1)={applicationID} 
RETURN DISTINCT 
    CASE {applicationID} 
    WHEN null THEN log0 
    ELSE log1 
    END 
    AS result 

Bei der Verwendung von Neo4j 3.2+, würde ich auch auf die new parameter syntax, $param statt {param}, Schalte betrachten, die machen die Abfragen sind etwas leichter zu lesen.

Verwandte Themen