我正在制作一个用于管理聊天的应用程序。
我有2个C#类:
public class Person
{
public string Name { get; set; }
public string Password { get; set; }
}
public class PrivateMessage
{
public long Id { get; set; }
public string Content { get; set; }
public long Stamp { get; set; }
public bool Received { get; set; }
}
我想要的只是在两个人之间创建与PrivateMessage属性的关系。
我创建了一个像这样的密码查询:
// Create a message from 'Doctor B' to 'Patient B'.
MATCH (Sender:Person), (Recipient:Person)
WHERE Sender.Name = 'Doctor B' AND Recipient.Name = 'Patient B'
CREATE (Sender)-[Message:SENT {Id: 0, Content: 'Hello', Stamp: 1000, Received: false}]->(Recipient)
但我不知道如何使用C#进行存档。 此外,我希望关系只能创建为2个节点,否则,它不能。
您可以观看我的图片以获取更多详细信息:
如您所见,我有2个实体:B医生和患者B,我可以在它们之间建立SENT关系。
但是如果我使用这个查询:
MATCH(发件人:人),(收件人:人) 在哪里Sender.Name ='医生A'和Recipient.Name ='患者A' 创建(发件人) - [消息:SENT {Id:0,内容:'你好',印章:1000,收到:假}] - >(收件人)
因为没有医生A和患者A,neo4j创建2个灰色节点,它们之间有SENT关系。
我的问题是:如何防止这种情况,我不想在此图像中创建灰色节点。
有人能帮帮我吗? 谢谢。
答案 0 :(得分:1)
如果两个节点存在,则只会创建一个关系,否则它将成为悬挂线:)
明智的C# - 你在看:var client = new GraphClient(new Uri("http://localhost.:7474/db/data"));
//The message to be sent.
var message = new Message {Id = 0, Content = "Hello", Stamp = 1000, Recieved = false};
var query = client.Cypher
.Match("(sender:Person)", "(recipient:Person)")
//These 'Wheres' create parameters in the query
.Where((Person sender) => sender.Name == "Person A")
.AndWhere((Person recipient) => recipient.Name == "Person B")
.Create("(sender)-[msg:SENT {message}]->(recipient)")
//The message is added as a parameter here
.WithParam("message", message)
.Return(msg => msg.As<Message>());
var msg = query.Results.Single();
我不知道你为什么要回复这条消息,如果你决定不这样做,只需将代码更改为:
var query = client.Cypher
.Match("(sender:Person)", "(recipient:Person)")
.Where((Person sender) => sender.Name == "Person A")
.AndWhere((Person recipient) => recipient.Name == "Person B")
.Create("(sender)-[msg:SENT {message}]->(recipient)")
.WithParam("message", message);
query.ExecuteWithoutResults();
无论哪种方式,如果 sender
和recipient
都存在,则只会创建的关系。