Neo4j клиент UNWIND с "DateTime?" - PullRequest
       15

Neo4j клиент UNWIND с "DateTime?"

0 голосов
/ 06 октября 2018

В настоящее время я пытаюсь раскрутить список TravelEdges, который имеет "DateTime?"но я продолжаю получать следующую ошибку:

{"CypherTypeException: несоответствие типов: ожидал карту, но был String (\" 2018-05-21T08: 38: 00 \ ")"}

В настоящее время я использую последнюю версию neo4j (3.4.8), и мне было интересно, если кто-то может помочь?

Кроме того, есть ли более эффективный способ добавления ребер без двух совпадений?Идентификаторы уникальны.

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;}
}

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

@ cypbersam является верным в отношении вашего второго запроса, но ваш sc равен a map, так как ваш класс TravelEdge рассматривается БД как map.

Я взял код в значительной степени дословно (см. Ниже), и когда я запускаю его с GraphClient или BoltGraphClient, он прекрасно работает для меня.Итак, я думаю, это может быть проблема с версией Neo4jClient - какую версию вы используете?

Рабочий код ниже

Будьте осторожны, если вы копируете / вставляете, яполностью удалите БД в первой паре строк

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;}
}
0 голосов
/ 19 октября 2018
  1. Каждое значение sc является строкой, но ваш запрос пытается использовать его, как если бы это была карта.То есть sc.Id1 и sc.Id2 не имеют никакого смысла, когда sc является строкой, а не картой.Вам нужно изменить значение travelpoints, чтобы оно представляло собой список карт со значениями Id1 и Id2.

  2. Нет способа гарантировать, что t:Travels_Toсуществует связь между двумя конкретными узлами без поиска этих узлов.Однако, чтобы ускорить поиск, вы можете создать индекс или ограничение уникальности для :Node(Id).

...