Program Tip

관계가없는 경우 노드 반환

programtip 2020. 10. 9. 12:18
반응형

관계가없는 경우 노드 반환


요리사가 가질 수있는 누락 된 재료를 "찾기"하는 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 MATCHWHERE, 절을 그래서 먼저 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

반응형