Как отфильтровать определенные c путей в neo4j? - PullRequest
0 голосов
/ 29 мая 2020

У меня есть граф db, который отображает отношения между исходными файлами. У меня есть следующий запрос, который находит все файлы, которые вызывают методы, определенные в данном исходном файле.

MATCH (sourceFile:JSSourceFile {filename: 'test.js'})-[:Defines]->(sourceMethod:Method)
<-[:Calls*1..5]-
(callerMethod:Method)<-[:Defines]-(callerFile:TSSourceFile)
RETURN sourceFile.fileName AS sourceFile, COLLECT(DISTINCT callerFile.fileName) AS callerFile
ORDER BY sourceFile

Теперь я добавил еще одну метку Utility к некоторым из существующих JSSourceFile узлов. Мне нужно отфильтровать TSSourceFile, методы которого вызывают utilityMethods. Это делается для того, чтобы избежать вызовов служебных методов, которые, в свою очередь, вызываются TSSoureFiles и в конечном итоге загрязняют результаты

(:JSSourceFile)-[:Defines]-(sourceMethods:Methods)<-[:Calls*1..5]-(:Method)<-[:Defines]-(callerMethod:TSSourceFile)
(:JSSourceFile:Utility)-[:Defines]->(utilityMethods:Method)
Need to eliminate this relationship: 
(sourceMethods)-[:Calls]->(utilityMethods)<-[:Calls]-(callerMethod)

Я пробовал следующие запросы, но они работают вечно на глубине 2+, и мне нужна глубина в диапазоне 1..5.

MATCH (:JSSourceFile:Utility)-[:Defines]->(utilityMethods:Method)
WITH DISTINCT (:TSSourceFile)-[:Defines]->(:Method)-[:Calls]->(utilityMethods) AS utilityCallerFile
MATCH
results=((sourceFile:JSSourceFile {fileName:"test.js"})-[:Defines]->(:Method)
<-[:Calls]-
(callerSub:Method)<-[:Defines]-(callerFile:TSSourceFile))
WITH DISTINCT [result IN nodes(results) WHERE "TSSourceFile" IN labels(result)] as results, sourceFile.fileName AS sourceFile, utilityCallerFile AS utilityCallerFile
RETURN sourceFile, COLLECT(DISTINCT [result IN results WHERE NOT(result IN utilityCallerFile) | result.fileName]) AS callerFile
ORDER BY sourceFile
MATCH
(sourceFile:JSSourceFile {fileName:"test.js"})-[:Defines]->(:Method)
<-[:Calls*1..3]-
(callerMethod:Method)<-[:Defines]-(callerFile:TSSourceFile)
WHERE NOT EXISTS((callerMethod)-[:Calls]->(sourceFile:Utility))
RETURN sourceFile.fileName, collect(DISTINCT callerFile.fileName)

Я новичок в neo4j, и любое руководство было бы действительно полезно. ?

1 Ответ

0 голосов
/ 29 мая 2020
• 1000 * Я добавил предложение WHERE NOT, чтобы исключить узлы: Utility.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...