无法将类型'Neo4jClient.NodeReference <>'隐式转换为'Neo4jClient.GraphClient'

Mik*_*nes 0 c# neo4j neo4jclient

这是一个两部分问题

  1. 我尝试创建一个新节点时收到此错误

    无法将类型'Neo4jClient.NodeReference'隐式转换为'Neo4jClient.GraphClient'

我这里有3个类第一个连接到GraphDB服务器并返回客户端变量以供以后在其他类中使用

public GraphClient GetConnection()
        {
            var client = new GraphClient(new Uri("http://localhost:7474/db/data"));
            client.Connect();
            return client;
        }
Run Code Online (Sandbox Code Playgroud)

然后是New_Node类,看起来像这样

 class New_Node
    {
        public GraphClient Node { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

然后是Graph Operations类,它具有CreateNode方法

public GraphClient CreateNode()
{
    Graph_Connection connection = new Graph_Connection();
    var NewNode = connection.GetConnection();
    var Created_Node = NewNode.Create(new New_Node());
    return Created_Node;
}
Run Code Online (Sandbox Code Playgroud)
  1. 如何在另一行代码上设置Node的属性而不是用节点创建它们,我想让我的应用程序更具动态性,这种方式似乎很难编码

    var refA = client.Create(new Person(){Name ="Person A"});

在Java中,人们可以做到这一点

Node user1 = this.graphDb.createNode(); 
user1.setProperty("name", "Mike");
Run Code Online (Sandbox Code Playgroud)

Tat*_*die 5

问题是你试图在节点本身内保持数据库连接.

这是您对节点数据结构的定义:

class New_Node
{
    public GraphClient Node { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这表示您希望在名为"Node"的节点上拥有一个属性,该属性保存与包含该节点的DB的连接.舌头扭曲了吗?我的是.

根据您的Java比较,我认为您希望您的节点实际上如下所示:

class New_Node
{
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这表示你想要一个带有Name属性的节点,它是一个字符串.

然后,您可以像这样创建它:

graphClient.Create(new New_Node { Name = "Mike" });
Run Code Online (Sandbox Code Playgroud)

关于你的子问题,"1.我如何在另一行代码上设置Node的属性,而不是用节点创建它们",当你调用graphClient.Create我们将它持久化到数据库时.任何以后的属性更改都是对DB的更新以及更多调用.

只需在节点准备好持久化时调用create.

var node = new New_Node();
... think ...
node.Name = "Mike";
... think ...
graphClient.Create(node);
Run Code Online (Sandbox Code Playgroud)

基本上,每次打电话graphClient.Something我们都会打到DB.这是因为我们正在讨论无状态API.这与在内存中与DB通信的Java驱动程序不同(假设您正在讨论嵌入式Neo4j实例).

HTH.

- 塔特姆