관계가없는 경우 노드 반환
요리사가 가질 수있는 누락 된 재료를 "찾기"하는 cypher를 사용하여 쿼리를 만들려고합니다. 내 그래프는 다음과 같이 설정됩니다.
(ingredient_value)-[:is_part_of]->(ingredient)
(ingredient)
키 / 값은 name = "dye colors"입니다. (ingredient_value)
key / value는 value = "red"이고 "is part of"일 수 (ingredient, name="dye colors")
있습니다.
(chef)-[:has_value]->(ingredient_value)<-[:requires_value]-(recipe)-[:requires_ingredient]->(ingredient)
이 쿼리를 사용하여 ingredients
레시피에 필요한 실제 값이 아닌 모든를 가져 오지만 ingredients
각 레시피에 필요한 모든 재료 대신 요리사가 가지고 있지 않은 값만 반환하고 싶습니다 . 나는 시도했다
(chef)-[:has_value]->(ingredient_value)<-[:requires_value]-(recipe)-[:requires_ingredient]->(ingredient)<-[:has_ingredient*0..0]-chef
그러나 이것은 아무것도 반환하지 않았습니다.
이것은 cypher / neo4j가 수행 할 수있는 것입니까, 아니면 모든 재료를 반환하고 직접 분류하여 가장 잘 처리되는 것입니까?
보너스 : 또한 셰프가 가지고있는 모든 값을 레시피에 필요한 모든 값과 일치시키기 위해 cypher를 사용하는 방법이 있습니다. 지금까지 a에 의해 반환 된 모든 부분 일치 만 반환 chef-[:has_value]->ingredient_value<-[:requires_value]-recipe
하고 결과를 직접 집계했습니다.
2013 년 1 월 10 일 업데이트 :
Neo4j 2.0 참조 에서 이것을 발견했습니다 .
선택적 관계를 사용하지 마십시오. 무엇보다도,
다음과 같이 사용하지 마십시오.
MATCH a-[r?:LOVES]->() WHERE r IS NULL
그들이 존재하지 않는지 확인하십시오.
대신 다음과 같이하십시오.
MATCH a WHERE NOT (a)-[:LOVES]->()
관계가 존재하지 않는지 확인하기 위해 cypher 사용 :
...
MATCH source-[r?:someType]-target
WHERE r is null
RETURN source
? 마크는 관계를 선택적으로 만듭니다.
또는
neo4j 2에서 다음을 수행하십시오.
...
OPTIONAL MATCH source-[r:someType]-target
WHERE r is null
RETURN source
이제 존재하지 않는 (null) 관계를 확인할 수 있습니다.
관계가없는 노드를 가져 오는 경우
관계가 있는지 여부를 확인하는 좋은 옵션입니다.
MATCH (player)-[r:played]->()
WHERE r IS NULL
RETURN player
이에 대한 여러 조건을 확인할 수도 있습니다. "played"또는 "notPlayed"관계가없는 모든 노드를 반환합니다.
MATCH (player)
WHERE NOT (player)-[:played|notPlayed]->()
RETURN player
실현성이없는 노드를 가져 오려면
MATCH (player)
WHERE NOT (player)-[r]-()
RETURN player
들어오는 / 나가는 관계가없는 노드를 확인합니다.
"조건부 제외"의미 체계가 필요한 경우 이러한 방식으로 수행 할 수 있습니다.
neo4j 2.2.1부터 OPTIONAL MATCH
절 을 사용 하고 일치하지 않는 ( NULL
) 노드를 필터링 할 수 있습니다 .
사용하는 것도 중요하다 WITH
사이 절 OPTIONAL MATCH
과 WHERE
, 절을 그래서 먼저 WHERE
정의하는 옵션 일치 조건과 두 번째 WHERE
필터처럼 동작합니다.
Assuming we have 2 types of nodes: Person
and Communication
. If I want to get all Persons which have never communicated by the telephone, but may have communicated other ways, I would make this query:
MATCH (p: Person)
OPTIONAL MATCH p--(c: Communication)
WHERE c.way = 'telephone'
WITH p, c
WHERE c IS NULL
RETURN p
The match pattern will match all Persons with their communications where c
will be NULL
for non-telephone Communications. Then the filter(WHERE
after WITH
) will filter out telephone Communications leaving all others.
References:
http://neo4j.com/docs/stable/query-optional-match.html#_introduction_3 http://java.dzone.com/articles/new-neo4j-optional
I wrote a gist showing how this can be done quite naturally using Cypher 2.0
http://gist.neo4j.org/?9171581
The key point is to use optional match to available ingredients and then compare to filter for missing (null) ingredients or ingredients with the wrong value.
Note that the notion is declarative and doesn't need to describe an algorithm, you just write down what you need.
I completed this task using gremlin. I did
x=[]
g.idx('Chef')[[name:'chef1']].as('chef')
.out('has_ingredient').as('alreadyHas').aggregate(x).back('chef')
.out('has_value').as('values')
.in('requires_value').as('recipes')
.out('requires_ingredient').as('ingredients').except(x).path()
This returned the paths of all the missing ingredients. I was unable to formulate this in the cypher language, at least for version 1.7.
The last query should be:
START chef = node(..)
MATCH (chef)-[:has_value]->(ingredient_value)<-[:requires_value]-(recipe)-[:requires_ingredient]->(ingredient)
WHERE (ingredient)<-[:has_ingredient]-chef
RETURN ingredient
This pattern: (ingredient)<-[:has_ingredient*0..0]-chef
Is the reason it didn't return anything. *0..0
means that the length of the relationships must be zero, which means that ingredient and chef must be the same node, which they are not.
참고URL : https://stackoverflow.com/questions/10952332/return-node-if-relationship-is-not-present
'Program Tip' 카테고리의 다른 글
"sort"명령을 사용하여 열 우선 순위별로 CSV 파일 정렬 (0) | 2020.10.09 |
---|---|
Git : 다른 브랜치에서 변경 사항 가져 오기 (0) | 2020.10.09 |
어쨌든 CSS 애니메이션으로 줄임표에 애니메이션을 적용 할 수 있습니까? (0) | 2020.10.09 |
창을 종료 할 때 실행할 작업을 예약하는 방법 (0) | 2020.10.09 |
클래스 경로와 빌드 경로의 차이점은 무엇입니까? (0) | 2020.10.09 |