带有C#的Neo4j:创建2个现有节点之间的关系,否则不要

时间:2016-05-17 04:10:32

标签: neo4jclient

我正在制作一个用于管理聊天的应用程序。

我有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个节点,否则,它不能。

您可以观看我的图片以获取更多详细信息:

enter image description here

如您所见,我有2个实体:B医生和患者B,我可以在它们之间建立SENT关系。

但是如果我使用这个查询:

MATCH(发件人:人),(收件人:人)     在哪里Sender.Name ='医生A'和Recipient.Name ='患者A'     创建(发件人) - [消息:SENT {Id:0,内容:'你好',印章:1000,收到:假}] - >(收件人)

因为没有医生A和患者A,neo4j创建2个灰色节点,它们之间有SENT关系。

我的问题是:如何防止这种情况,我不想在此图像中创建灰色节点。

有人能帮帮我吗? 谢谢。

1 个答案:

答案 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();

无论哪种方式,如果 senderrecipient都存在,则只会创建的关系。