2016-03-04 2 views
0
var query = client.Cypher 
      .Match("(n1)-[r]-[n2]") 
      .Where("n1.NodeId={startNodeId} and n2.NodeId={endNodeId}") 
      .WithParam("startNodeId",startNodeId) 
      .withParam("endNodeId",endNodeId) 
      .return((r,n1,n2)=>new {Edge=r.As<Node<string>>(),Type=r.Type()}); 

По этому пути, я могу получить только отношения в этикетки и Свойства .Но я также хочу, чтобы получить startNodeId взаимосвязи в и endNodeId. Кстати, я могу получить startNodeId и endNodeId с помощью REST API. Как мне помочь?Как получить отношения startNodeId и endNodeId с помощью Neo4jClient?

Z.Tom

ответ

0

Это зависит от того, что вы подразумевая под startNodeId - если вы имеете в виду, что Neo4j Идентификаторы, то вы будете хотеть использовать Relationship<T> класс:

client.Cypher 
    .Match("(n1)-[r]-(n2)") 
    //Your where stuff here. 
    .Return(r => r.As<RelationshipInstance<string>()); 

T должен быть тип вы поставить на отношения, но если вы не получили, что, просто использовать object, вы будет необходимо использовать Relationship<T> тип, вы не можете использовать не общий вариант.

Если startNodeId - это собственность на тип, то вы либо делаете r => r.As<YourType>(), либо r => r.As<Relationship<YourType>>().

В качестве примечания, вы можете использовать Neo4jClient сек способность анализировать параметры и сохранить некоторый код (также сделать его более компилировать безопасно) относительно ваших Where статей.

Я хотел бы написать свой код, как:

var query = client.Cypher 
    .Match("(n1)-[r]-[n2]") 
    .Where((NodeType n1) => n1.NodeId == startNodeId) 
    .AndWhere((NodeType n2) => n2.NodeId == endNodeId) 
    .Return(r => new { Edge = r.As<RelationshipInstance<object>>(), Type = r.Type()}); 

, которая автоматически анализирует параметры.

+0

Я хочу получить идентификаторы Neo4j для startNodeId и endNodeId из отношения, которое вернулось. Я пробовал ваш метод, но я встречаю исключение, когда я исправляю. Ошибка: System.ArgumentException Вы вызывали As () в своем предложении, где Relationship'1 не поддерживается. Он должен быть простым типом (например, int, string или long) ...... –

+0

Извините - это должно было быть 'RelationshipInstance' - если вы прочитаете все сообщение об ошибке, которое вы увидите в конце, оно упоминает об этом. - Если это не поможет - я думаю, вам нужно отредактировать свой вопрос с помощью Cypher, который доставит вам то, что вы хотите, и мы можем идти оттуда! –

+0

Thx, Chris Skardon, я нашел то, что хочу, используя RelationshipInstance! –

0

Если вы знаете, классы, которые вы хотите, чтобы бросить, Вы можете использовать:

var results= client.Cypher 
      .Match("(n1)-[r]-[n2]") 
      .Where("n1.NodeId={startNodeId} and n2.NodeId={endNodeId}") 
      .WithParam("startNodeId",startNodeId) 
      .withParam("endNodeId",endNodeId) 
.Return((n1, r1 n2) => new {Edge=r.As<Node<string>>(),Type=r.Type()}, Class1= n1.As<Class1>(), Class2= n2.As<Class2>()}) 
.Results; 

Затем вы можете перебирать по результатам. Если только один результат, как ожидается, первый элемент в массиве «Результаты»

+0

Я просто хочу знать, как отличить startNode и endNode, поэтому я попытался получить информацию из отношений. И r.As >() просто содержит метку и свойства отношений. –

+0

Если вы хотите получить метки узла, используйте n1.Labels(). Если вы не знаете тип, ссылка http://stackoverflow.com/questions/21860074/casting-nodes-of-an-unknown-type объясняет, что узлы каста неизвестного типа – joe

Смежные вопросы