2016-05-17 126 views
0

我正在制作一个用于管理聊天的应用程序。Neo4j与C#:创建2个现有节点之间的关系,否则不要

我有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的2人之间的性关系。

我创造了这样一个暗号查询:

// 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(发件人:人),(开户单位:人) WHERE Sender.Name = '医生A' 和Recipient.Name = '患者A' CREATE( (收件人)

因为没有医生A和患者A,所以neo4j创建了2个发送者(发件人) - [消息:SENT {Id:0,Content:'Hello',Stamp:1000,Received:false}] - >它们之间具有SENT关系的灰色节点。

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

任何人都可以帮助我吗? 谢谢。

回答

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

+0

其实我知道悬挂线,我检查节点存在的目标是防止悬挂线:)。 – Redplane

+0

你永远不可能在Neo4j上挂起一条线,这是不可能的,一段关系有一个开始和一个结束(它们可以是相同的),但它必须有两个,而不仅仅是一个! –

相关问题