1

我在 SQL Server 中使用 Graph Table 。

这是我的桌子:

--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

如何选择 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)
 )

但我想以其他方式理解?

我想使用这样的代码:

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))

请帮我解决这个问题。

4

1 回答 1

5

MATCH 中的节点名称可以重复。换句话说,一个节点可以在同一个查询中被遍历任意次数。边名不能在 MATCH 内重复。一条边可以指向任一方向,但它必须有一个明确的方向。MATCH 模式不支持 OR 和 NOT 运算符。MATCH 可以在 WHERE 子句中使用 AND 与其他表达式组合。但是,不支持使用 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);

这种模式也可以表示如下

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);
于 2018-06-26T10:19:05.753 回答