2017-04-20 149 views
0

我一直在为此奋斗了两天,并且处于茫然之中。我试图创建节点关系,并且严重失败。创建关系

这是我创建和运行关系的代码。

var query = graphClient.Cypher 
 
    .Match("(apt_1:AttackPatterns)", "(apt_2:AttackPatterns)") 
 
    .Where((AttackPatterns apt_1) => apt_1.Id == Convert.ToInt64(apt.ID)) 
 
    .AndWhere((AttackPatterns apt_2) => apt_2.Id == Convert.ToInt64(rt.Relationship_Target_ID)) 
 
    .CreateUnique("(apt_1)-[:" + rtrn.ToString() + "]->(apt_2)"); 
 

 
query.ExecuteWithoutResults();

这里是AttackPatterns类。

public class AttackPatterns 
 
{ 
 
     public long Id { get; set; } 
 
     public string Name { get; set; } 
 
}

在运行期间,对于查询中的值等于,在一个迭代中,为以下内容:

MATCH(apt_1:AttackPatterns),(apt_2:AttackPatterns)\ r \ nWHERE (apt_1.Id = \“1 \”)\ r \ nAND(apt_2.Id = \“122 \”)\ r \ nCREATE UNIQUE(apt_1) - [:ChildOf] - >(apt_2)

我注意到“\ r \ n”字符。我也注意到1和122左右的引号。当我将它粘贴到Neo4j网络界面中,用实际的新行替换“\ r \ n”并在引号前删除“\”转义字符时,它失败。如果我删除1和122周围的引号,它会成功创建关系。

我真的不知道我做错了什么,并希望得到任何帮助!

+0

什么类型是'rt' ?,并且'apt'是'AttackPatterns'? –

回答

0

我做了关于类型的一些假设,因为我觉得知道发生了什么事 - 基本上 - 在Convert.ToInt64称为由查询之前,你必须这样做查询生成的外:

//Given: 
var apt = new { ID = "1" }; 

//Convert outside query 
var ap1Id = Convert.ToInt64(apt.ID); 

//Use in query 
var query = gc.Cypher 
    .Match("(apt_1:AttackPatterns)", "(apt_2:AttackPatterns)") 
    .Where((AttackPatterns apt_1) => apt_1.Id == ap1Id) // <-- using locally created var 
/* etc */ 

\r\n只是当你看DebugQueryText财产格式化,他们没有跨越发送,唯一的问题是围绕着数字的"

请随意将此作为bug添加到github项目中,我会仔细查看它,理想情况下它会事先执行,但可能是因为这个原因。

+0

谢谢你回到我身边。如果它给出了更多的见解,我尝试了以下代码,结束了工作: – Jason

+0

var query = graphClient.Cypher .Match(“(apt_1:AttackPattern)”,“(apt_2:AttackPattern)”) .Where(“ (“apt_1.Id = {id1}”) .WithParam(“id1”,Convert.ToInt64(apt.ID)) .AndWhere(“apt_2.Id = {id2}”) .WithParam(“id2”,Convert。 ToInt64(rt.Relationship_Target_ID)) .CreateUnique(“(apt_1) - [:”+ rtrn.ToString()+“] - >(apt_2)”); – Jason

+0

酷,'WithParam'调用评估它,这是比我的版本更好;) –