2016-05-17 127 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上掛起一條線,這是不可能的,一段關係有一個開始和一個結束(它們可以是相同的),但它必須有兩個,而不僅僅是一個! –

相關問題