我们一直在尝试编写一个C#客户端,它为一个Neo4j实例提供一些节点和关系。在尝试创建关系属性时,我们正面临着问题。
以下是使用flag属性创建关系的代码:
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; }
}
}
当我们查看数据浏览器选项卡中的数据时,关系中没有属性。我们还创建了一个关系指数?
我们缺少什么/做错了什么?
答案 0 :(得分: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" }));
答案 1 :(得分:2)
(背景:我领导Neo4jClient项目。)
肖恩的回答是正确的,但是过时了。
Neo4j和Neo4jClient的方向都是针对Cypher,作为您需要做的所有事情的统一方法。
此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();
一些注意事项:
Create
到CreateUnique
的简单切换将确保您不会创建两次相同的关系;采用程序方法会更加困难。WithParam
来确保所有内容都被正确编码,并且您仍然可以传入漂亮的对象WithParam
来允许查询计划缓存