Создание связей между узлами в Neo4j с Neo4jClient в C#


Я работаю с Neo4j, используя .Net Neo4jClient (http://hg.readify.net/neo4jclient/wiki/Home в моем коде узлы-это аэропорты, а отношения-это рейсы.

Если я хочу создавать узлы и отношения одновременно, я могу сделать это с помощью следующего кода:

Классы

public class Airport
{
    public string iata { get; set; }
    public string name { get; set; }
}

public class flys_toRelationship : Relationship, IRelationshipAllowingSourceNode<Airport>, IRelationshipAllowingTargetNode<Airport>
{
    public static readonly string TypeKey = "flys_to";

    // Assign Flight Properties
    public string flightNumber { get; set; }

    public flys_toRelationship(NodeReference targetNode)
        : base(targetNode)
    { }

    public override string RelationshipTypeKey
    {
        get { return TypeKey; }
    }
}

Main

// Create a New Graph Object
var client = new GraphClient(new Uri("http://localhost:7474/db/data"));
client.Connect();

// Create New Nodes
var lax = client.Create(new Airport() { iata = "lax", name = "Los Angeles International Airport" });
var jfk = client.Create(new Airport() { iata = "jfk", name = "John F. Kennedy International Airport" });
var sfo = client.Create(new Airport() { iata = "sfo", name = "San Francisco International Airport" });

// Create New Relationships
client.CreateRelationship(lax, new flys_toRelationship(jfk) { flightNumber = "1" });
client.CreateRelationship(lax, new flys_toRelationship(sfo) { flightNumber = "2" });
client.CreateRelationship(sfo, new flys_toRelationship(jfk) { flightNumber = "3" });
Проблема, однако, заключается в том, когда я хочу добавить отношения к уже существующим узлам. Допустим, у меня есть график, состоящий только из двух узлы (аэропорты), говорят СНС и особым, и я хотел бы добавить связь (рейс) от СНС в ресторан. Я пытаюсь сделать следующее, И это не удается:
// Create a New Graph Object
var client = new GraphClient(new Uri("http://localhost:7474/db/data"));
client.Connect();

Node<Airport> departure = client.QueryIndex<Airport>("node_auto_index", IndexFor.Node, "iata:sna").First();
Node<Airport> arrival = client.QueryIndex<Airport>("node_auto_index", IndexFor.Node, "iata:ewr").First();
//Response.Write(departure.Data.iata); <-- this works fine, btw: it prints "sna"

// Create New Relationships
client.CreateRelationship(departure, new flys_toRelationship(arrival) { flightNumber = "4" });

Две ошибки, которые я получаю, следующие:

1) Аргумент 1: не удается преобразовать из ' Neo4jClient.Узел ' to ' Neo4jClient.NodeReference '

2) аргументы типа для метода ' Neo4jClient.Графклиент.CreateRelationship (Neo4jClient.NodeReference, TRelationship) ' не может быть выведено из использования. Попробуйте указать аргументы типа явно.

Метод, на который ссылается ошибка, относится к следующему классу: http://hg.readify.net/neo4jclient/src/2c5446c17a65d6e5accd420a2dff0089799cbe16/Neo4jClient/GraphClient.cs?at=default

Есть идеи?

1 5

1 ответ:

В вашем вызове CreateRelationship вам нужно будет использовать ссылки на узлы, а не на узлы, поэтому:

client.CreateRelationship(departure.Reference, new flys_toRelationship(arrival.Reference) { flightNumber = "4" });

Причина, по которой ваш исходный код создания работает, а это не так, заключается в том, что Create возвращает вам NodeReference<Airport> (var скрывает это для вас), а QueryIndex возвращает экземпляр Node<Airport> вместо этого.

Neo4jClient преимущественно использует NodeReference для большинства своих операций.

Вторая ошибка, которая у вас была, была просто связана с тем, что вы не использовали свойство .Reference, поскольку оно не могло определить типы, при использовании свойства .Reference Эта ошибка также исчезнет.