2016-05-17 4 views
0

Я делаю приложение, которое используется для управления чатом.Neo4j с C#: Создайте связь между двумя существующими узлами, в противном случае dont

У меня есть 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 людей.

Я создал Cypher запрос следующим образом:

// 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, я могу создать ОТПРАВЛЕННЫЕ отношения между ними.

Но если я использую этот запрос:

MATCH (Sender: Person), (Получатель: Person) WHERE Sender.Name = 'Доктор А' И Recipient.Name = 'Пациент A' CREATE (Sender) - [Сообщение: SENT {Id: 0, Содержимое: 'Hello', Stamp: 1000, Received: false}] -> (Получатель)

Поскольку нет Доктора A и Пациента A, neo4j create 2 серые узлы с отношением 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(); 

в любом случае, отношения будут созданы только если оба sender и recipient есть.

+0

На самом деле, я знаю о подвесной линии, моей целью проверки существования узла является предотвращение висящей линии :). – Redplane

+0

У вас никогда не может быть подвесной линии в Neo4j, это невозможно, отношения имеют начало и конец (они могут быть одинаковыми), но он должен иметь оба, а не только один! –