вы можете попробовать что-то вроде ниже:
SELECT
p1.userName,
p1.userName as StartNode,
LAST_VALUE(p2.userName) WITHIN GROUP (GRAPH PATH) AS FinalNode,
STRING_AGG(p2.userName,'->') WITHIN GROUP (GRAPH PATH) AS [Edges Path],
COUNT(p2.userName) WITHIN GROUP (GRAPH PATH) AS Levels
FROM
dbo.Person p1,
dbo.Person FOR PATH p2,
dbo.Follow FOR PATH Follow
WHERE
MATCH(SHORTEST_PATH(p1(-(Follow)->p2)+))
AND p1.userName = 'C';
, чтобы найти все входящие соединения для узла, нам нужно обернуть запрос и фильтр для конечного узла, как показано ниже:
SELECT
username, StartNode, [Edges Path], FinalNode, Levels
FROM (
SELECT
P1.username,
P1.username as StartNode,
STRING_AGG(P2.userName,'->') WITHIN GROUP (GRAPH PATH) AS [Edges Path],
LAST_VALUE(P2.userName) WITHIN GROUP (GRAPH PATH) AS FinalNode,
COUNT(P2.userName) WITHIN GROUP (GRAPH PATH) AS Levels
FROM
Person P1,
Person FOR PATH P2,
Follow FOR PATH Follow
WHERE
MATCH(SHORTEST_PATH(P1(-(Follow)->P2)))
) AS Q
WHERE Q.FinalNode = 'C'
Чтобы ограничить уровни или количество прыжков, мы можем предоставить квантификаторы рекурсии вместо (+ --- один или более), как показано ниже:
SELECT
username, StartNode, [Edges Path], FinalNode, Levels
FROM (
SELECT
P1.username,
P1.username as StartNode,
STRING_AGG(P2.userName,'->') WITHIN GROUP (GRAPH PATH) AS [Edges Path],
LAST_VALUE(P2.userName) WITHIN GROUP (GRAPH PATH) AS FinalNode,
COUNT(P2.userName) WITHIN GROUP (GRAPH PATH) AS Levels
FROM
Person P1,
Person FOR PATH P2,
Follow FOR PATH Follow
WHERE
MATCH(SHORTEST_PATH(P1(-(Follow)->P2){1,3}))
) AS Q
WHERE Q.FinalNode = 'C'