当子句不匹配时如何从SQL Server图形表中选择

mhs*_*kar 1 sql sql-server sql-server-2017 sql-server-2017-graph

我在SQL Server中使用图表。

这是我的桌子:

--Node Table
CREATE TABLE [dbo].[Users]
(
    [ID] [int] NOT NULL Primary key,
    [FName] [nvarchar](100) NULL,
    [LName] [nvarchar](100) NULL
)AS NODE
--Edge Table
CREATE TABLE [dbo].[FriendsOf] AS EDGE
Run Code Online (Sandbox Code Playgroud)

如何选择User2的所有User1朋友和User2是User3的朋友,而User1和User3之间没有直接Edge关系。

我可以这样写这个查询:

 select distinct 
     u1.FName + ' ' + u1.LName as FirstFullName, 
     u2.FName + ' ' + u2.LName as SecondFullName,
     u3.FName + ' ' + u3.LName as ThirdFullName
 from
     Users u1, FriendsOf fo1, Users u2, FriendsOf fo2, Users u3
 where 
     match(u1-(fo1)->u2-(fo2)->u3) 
     and not exists(select 1 from friendsof fof 
                    where (fof.$from_id = u1.$node_id and fof.$to_id = u3.$node_id) or (fof.$from_id = u3.$node_id and fof.$to_id = u1.$node_id)
 )
Run Code Online (Sandbox Code Playgroud)

但我想了解其他方式吗?

我想使用这样的代码:

select distinct u1.FName + ' ' + u1.LName as FirstFullName, u2.FName + ' ' + u2.LName as SecondFullName,u3.FName + ' ' + u3.LName as ThirdFullName
from Users u1 , FriendsOf fo1 , Users u2 , FriendsOf fo2 , Users u3 , FriendsOf fo3,, FriendsOf fo4
where match(u1-(fo1)->u2-(fo2)->u3) and (not match(u1-(fo3)->u3) or not match(u3(fo4)->u1))
Run Code Online (Sandbox Code Playgroud)

请帮我解决这个问题。

Mor*_*joo 5

MATCH中的节点名称可以重复。换句话说,一个节点可以在同一查询中遍历任意次数。边缘名称不能在MATCH中重复。边可以指向任一方向,但必须具有明确的方向。MATCH模式不支持OR和NOT运算符。可以在WHERE子句中使用AND将MATCH与其他表达式组合。但是,不支持使用OR或NOT将其与其他表达式结合使用。找到2个同时是同一用户的朋友的用户

SELECT Person1.name AS Friend1, Person2.name AS Friend2
FROM user user1, friend friend1, user user2,
friend friend2, user user0
WHERE MATCH(user1-(friend1)->user0<-(friend2)-user2);
Run Code Online (Sandbox Code Playgroud)

这种模式也可以表示如下

SELECT user1.name AS Friend1, user2.name AS Friend2
FROM user user2, friend friend1, user user2,
friend friend2, user user0
WHERE MATCH(user1-(friend1)->user0 AND user2-(friend2)->user0);
Run Code Online (Sandbox Code Playgroud)