【问题标题】:Neo4j with C# : Create relation between 2 existing nodes, otherwise dontNeo4j 与 C#:在 2 个现有节点之间创建关系,否则不要
【发布时间】:2016-05-17 04:10:31
【问题描述】:

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

我有 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; }
}

我只想在 2 个人之间创建与 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 关系。

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

匹配(发件人:人),(收件人:人) WHERE Sender.Name = 'Doctor A' AND Recipient.Name = 'Patient A' CREATE (Sender)-[Message:SENT {Id: 0, Content: 'Hello', Stamp: 1000, Received: false}]->(Recipient)

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

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

谁能帮帮我? 谢谢。

【问题讨论】:

    标签: neo4jclient


    【解决方案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 都存在时 才会创建关系。

    【讨论】:

    • 其实我知道挂线,我检查节点存在的目的是防止挂线:)。
    • 在 Neo4j 中你永远不可能有一条悬线,这是不可能的,一段关系有开始和结束(它们可以是相同的),但它必须同时拥有,而不是只有一个!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    相关资源
    最近更新 更多