1

我们一直在尝试编写一个 C# 客户端,为 Neo4j 实例提供一些节点和关系。在尝试创建关系属性时,我们面临着问题。

以下是使用标志属性创建关系的代码:

var s = clientConnection.CreateRelationship(root, new RelationshipPrincipleToContent("SECURITY", rootFolder) { flags = "+W" });

这是关系类:

public class RelationshipPrincipleToContent : Relationship, IRelationshipAllowingSourceNode<Principles>, IRelationshipAllowingTargetNode<Content>{
    public string flags { get; set; }
    string RelationshipName;

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

    public RelationshipPrincipleToContent(string RelationshipName, NodeReference targetNode): base(targetNode){
        this.RelationshipName = RelationshipName;
    }

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

当我们在数据浏览器选项卡中查看数据时,关系上没有任何属性。我们还创建了关系索引?

我们错过了什么/做错了什么?

4

2 回答 2

2

首先添加一个包含公共字符串集合的类(在此实例中为 PayLoad.cs)。

 public class PayLoad
    {
        public string Comment { get; set; }
    }

更新您的关系类以使用此 PayLoad 类:

public class RelationshipPrincipleToContent : Relationship<PayLoad>, IRelationshipAllowingSourceNode<Principles>, IRelationshipAllowingTargetNode<Content>
    {
        string RelationshipName;

        public RelationshipPrincipleToContent(string RelationshipName, NodeReference targetNode, PayLoad pl)
            : base(targetNode, pl)
        {
            this.RelationshipName = RelationshipName;
        }

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

现在只需更新您对关系类的方法调用:

clientConnection.CreateRelationship(AllPrincipals, new RelationshipPrincipleToContent("SECURITY", rootFolder, new PayLoad() { Comment = "+R" }));
于 2013-09-10T14:02:08.427 回答
2

(背景:我领导 Neo4jClient 项目。)

肖恩的回答是正确的,但已经过时了。

Neo4j 和 Neo4jClient 的方向都是将 Cypher 作为您需要做的所有事情的统一方法。

这个密码查询:

START root=node(0), rootFolder=node(123)
CREATE root-[:SECURITY { flags: 'W+' }]->rootFolder

这是在 C# 中:

client.Cypher
    .Start(new { root = client.RootNode, rootFolder })
    .Create("root-[:SECURITY {security}]->rootFolder")
    .WithParam("security", new { flags = "+W" })
    .ExecuteWithoutResults();

一些注意事项:

  1. 开始使用 Cypher 处理这种类型的东西可能看起来有点复杂,但对你来说它会变得更好。例如,从Createto的简单切换CreateUnique将确保您不会两次创建相同的关系;如果采用程序方法,这将更加困难。
  2. Neo4jClient 中的非 Cypher 包装器有点陈旧且笨拙,并且不会看到任何重大的投资向前发展
  3. C# 方法用于WithParam确保所有内容都正确编码,并且您仍然可以传入漂亮的对象
  4. C# 方法用于WithParam允许查询计划缓存
于 2013-09-11T01:47:47.173 回答