Neo4j客户端使用"DateTime?"进行UNWIND操作

4
我目前正在尝试解开一个包含“DateTime?”的TravelEdges列表,但我一直收到以下错误消息:
{"CypherTypeException:类型不匹配:预期为映射,但是是String(\"2018-05-21T08:38:00\")"}
我目前正在使用最新版本的neo4j(3.4.8),想知道是否有人可以帮助?
此外,是否有更有效的方法添加边缘而不必进行两个匹配? Id是唯一的。
List<TravelEdge> travelpoints = new List<TravelEdge>();

//Add stuff to list

graphClient.Cypher
.Unwind(travelpoints, "sc")
.Match("(s1:Node { Id: sc.Id1})")
.Match("(s2:Node { Id: sc.Id2})")
.Merge("(s1)-[t:Travels_To]->(s2)")
.OnCreate()
.Set("t.Time = sc.TravelTime")
.ExecuteWithoutResults();


public class Node{

//Unique
public long Id {get;set;}

}

public class Edge {

public DateTime? TravelTime {get;set;}

}

public class TravelEdge{

public long Id1 {get;set;}

public long Id2 {get;set;}

public DateTime? TravelTime {get;set;}
}

1
尝试以函数式方式匹配具有ID的节点。 .Match("(s1:Node { Id: sc.Id1})") --> .Match("(s1:Node)"),其中id(s1)=sc.id1 同时通过转换设置时间。 .Set("t.Time = sc.TravelTime") --> .Set("t.Time = DateTime(sc.TravelTime)") - Vipul Pandey
2个回答

2
@cypbersam关于您的第二个查询是正确的,但是您的sc实际上是一个map,因为您的TravelEdge类在DB中被视为一个map
我几乎完全照抄了下面的代码(请参见下文),当我使用GraphClientBoltGraphClient运行它时,它对我来说完全正常。所以,我想这可能是与Neo4jClient的版本有关 - 您使用的是哪个版本?
以下是可工作的代码: 如果您复制/粘贴,请小心,我在前几行中完全删除了DB
void Main()
{
    //var graphClient = new GraphClient(new Uri("http://localhost:7474/db/data"), "neo4j", "neo");
    var graphClient = new BoltGraphClient("bolt://localhost:7687", "neo4j", "neo");
    graphClient.Connect();

    graphClient.Cypher.Match("(n)").DetachDelete("n").ExecuteWithoutResults();

    List<TravelEdge> travelpoints = new List<TravelEdge>{
        new TravelEdge { Id1 = 1, Id2 = 2, TravelTime = new DateTime(2000,1,1) },
        new TravelEdge { Id1 = 2, Id2 = 3, TravelTime = new DateTime(2000,1,2) },
        new TravelEdge { Id1 = 3, Id2 = 4, TravelTime = new DateTime(2000,1,3) },
        new TravelEdge { Id1 = 4, Id2 = 5, TravelTime = null },
    };

    var ids = new [] {1,2,3,4,5};
    graphClient.Cypher
        .Unwind(ids, "id")
        .Merge("(a:Node {Id: id})")
        .ExecuteWithoutResults();



    //Add stuff to list
    graphClient.Cypher
        .Unwind(travelpoints, "sc")
        .Match("(s1:Node { Id: sc.Id1})")
        .Match("(s2:Node { Id: sc.Id2})")
        .Merge("(s1)-[t:Travels_To]->(s2)")
        .OnCreate()
        .Set("t.Time = sc.TravelTime")
        .ExecuteWithoutResults();
}


public class Node{
    public long Id {get;set;}
}

public class TravelEdge {
    public long Id1 {get;set;}
    public long Id2 {get;set;}
    public DateTime? TravelTime {get;set;}
}

它能工作,但自从我添加了APOC以来似乎出现了问题。也许只是巧合。 - Liam
这应该只是巧合 - 我没有在这里使用任何 APOC,并且在一个原始的 Neo4j 实例上运行了我的代码 :) - Charlotte Skardon

0
  1. 每个 sc 值都是一个字符串,但是你的查询正在尝试将其用作映射。也就是说,当 sc 是字符串而不是映射时,sc.Id1sc.Id2 没有任何意义。您需要更改 travelpoints 值,使其成为带有 Id1Id2 值的地图列表。

  2. 没有办法确保 t:Travels_To 关系存在于 2 个特定节点之间,除非查找这些节点。但是,为了加速查找,您可以在 :Node(Id) 上创建 index 或唯一性约束


谢谢回复,但您能提供一个例子吗?我已经完成了第二个问题 :)我也更新了代码片段。 - Liam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接