Neo4j Cypher ручной индекс взаимосвязи, триггер APOC и дублирование данных - PullRequest
0 голосов
/ 23 мая 2018

У меня есть следующий запрос, который использует операции простого отношения для фильтрации узлов:

MATCH (dg:DecisionGroup)-[:CONTAINS]->(childD:Decision) 
WHERE dg.id = 1 
MATCH (childD)-[relationshipValueRel2:HAS_VALUE_ON]->(filterCharacteristic2:Characteristic) 
WHERE filterCharacteristic2.id = 2 
WITH relationshipValueRel2, childD, dg  
WHERE   (ANY (id IN [".NET"] WHERE id IN relationshipValueRel2.value ))  
RETURN childD.name

, который возвращает только один узел (как и ожидалось):

"Candidate1"

Вывод PROFILE:

enter image description here

Я хотел бы оптимизировать производительность запроса, и поэтому я использую следующий триггер для добавлениясвязь с индексом вручную:

CALL apoc.trigger.add('HAS_VALUE_ON_ASSIGNED_RELATIONSHIP_PROPERTIES_TRIGGER', "UNWIND keys({assignedRelationshipProperties}) AS key 
UNWIND {assignedRelationshipProperties}[key] AS map 
WITH map 
WHERE type(map.relationship) = 'HAS_VALUE_ON' 
CALL apoc.index.addRelationship(map.relationship, keys(map.relationship))  RETURN true", 
{phase:'before'})

и следующий запрос для получения тех же данных, что и первый, но только из индекса вручную:

MATCH (dg:DecisionGroup)-[:CONTAINS]->(childD:Decision) 
WHERE dg.id = 1 
MATCH (childD)-[relationshipValueRel2:HAS_VALUE_ON]->(filterCharacteristic2:Characteristic) 
WHERE filterCharacteristic2.id = 2 
WITH relationshipValueRel2, filterCharacteristic2, childD, dg   
CALL apoc.index.in(filterCharacteristic2,'HAS_VALUE_ON','(value:(".NET"))') 
YIELD node WITH node AS childD 
RETURN childD.name

, но проблема заключается в, что этот запрос возвращает два экземпляра одного и того же узла:

"Candidate1"
"Candidate1"

Выход PROFILE:

enter image description here

Что я делаю не так и почему этот запрос возвращает 2 экземпляра вместо одного?

...