2017-11-13 7 views
2

소프트웨어 시스템 내에 조직과 응용 프로그램이 있습니다. 사용자 조치는 로그 레코드를 생성합니다. 로그 레코드 (녹색)는 조직에 속하고 (빨간색) 응용 프로그램에 속할 수 있습니다 (분홍색).cypher의 선택적 관계 매개 변수로 필터링하는 방법은 무엇입니까?

Neo4j DB model

매개 변수의 다양한 세트 (등 작성 시간, 저자, 조직)에 의해 로그 레코드를 필터링 할 필요가있다. 이 매개 변수가 지정되지 않은 경우 로그 레코드가 속한 응용 프로그램에 의해 로그 레코드를 필터링하고 시스템의 모든 로그 레코드를 등록하십시오. 이렇게하려면 다음 쿼리를 만들었습니다.

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 

매개 변수가 선택 사항이므로 지정하지 않으면 상황을 처리해야합니다. 이 경우 ID(a)=coalesce({applicationID}, ID(a))을 사용하기로 결정했는데 applicationID 매개 변수가 지정되지 않은 경우 ID(a)=ID(a)과 같을 것입니다 (이 매개 변수로 필터링하지 않기 때문에 실제로 달성 할 내용).

선택적 관계로이 필터링을 수행하는보다 세련된 방법이 있는지 궁금합니다. 나는

MATCH 
(a:Application)<-[:GENERATED_IN*0..1]-(log:Log)-[:GENERATED_IN]->(org:Organization) 
WHERE ID(a)=coalesce({applicationID}, ID(a)) 
RETURN 
log 

을 시도 또한 OPTIONAL MATCH와 쿼리를 시도했지만 성공하지. 개선을위한 제안을 부탁드립니다.

그리고 BTW, neo4j 브라우저 콘솔에서 {applicationID}과 같은 매개 변수를 지정하는 방법이 있습니까? <query>, {applicationID}=202175처럼. 매번 수동으로 값을 대체합니다.

+1

"매개 변수를 지정하는 방법이 있습니까 [...]?" 잘 알려지지는 않지만,': param' 명령이 있습니다. https://stackoverflow.com/questions/42397773/neo4j-what-is-the-syntax-to-set-cypher-query-parameters-in-the-browser-interfac를 참조하십시오. –

답변

1

대신 coalesce, 당신은 IS NULL를 사용하고 매개 변수를 제공 한 경우 확인할 수 있습니다 :

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 

Neo4j 3.2 이상을 사용하여, 나는 또한 만드는, $param 대신 {param}의, new parameter syntax 로의 전환을 고려해야하세요 쿼리가 약간 더 읽기 쉽습니다.