2013-02-27 2 views
1

Я недавно начал использовать Neo4JClient для интеграции с .NET, и я (в конечном итоге) понял, что из этого вышло. Однако это меня насторожило.Как получить путь в Neo4jClient?

Мне интересно получить пути назад из запроса Cypher, желательно в объект POCO, поэтому я могу работать с интерфейсом для этих запросов.

Итак, мой вопрос в основном заключается в том, как это сделать в Neo4JClient? И если я не могу, любой из других клиентов Neo4J .NET поддерживает это?

Образца высчитывать запрос:

start n = node:idx(id="{id}") 

MATCH p=(n)-[:RELATED_TO*0..3]-() 

RETURN p; 

Итак, я хочу, чтобы все узлы вокруг конкретного узла с обеими входящими и исходящими отношениями на глубину 3. Там другой тип запроса тоже, но он использует тетивы и Мне нужно выяснить, поддерживает ли Neo4JClient (другой вопрос там).

До сих пор я использовал Gremlin с открытыми и закрытыми наборами для заполнения пользовательского объекта информацией о его зависимостях. Это отнюдь не эффективно, поэтому почему-то я хотел бы сделать это с помощью путей. Соответствующий объект выглядит немного так.

public class ConnectedNode : BaseNode 
{ 
    public List<NodeRelation> RelatedNodes { get; set; } 

    public ConnectedNode() 
    { 
     RelatedNodes = new List<NodeRelation>(); 
    } 
} 

public class NodeRelation 
{ 
    // ... various properties for relationship payload type stuff 
    public ConnectedNode RelatedNode { get; set; } 
    public RelationshipDirection Direction { get; set; } 
} 

Я рад за все, что отодвигает данные узла и отношений на пути, я ищу тех пор, пока он эффективен.

+0

У вас есть пример запроса, для которого вы хотите получить пути? то, что вы пытаетесь? –

+0

@ Крис, да, конечно. Я поправлю свой ответ на примерный запрос. Вы спрашиваете, могу ли я предположить, что он поддерживает некоторые пути, но не другие? –

ответ

1

В итоге я решил ответить на эту проблему и написал blog post по этому вопросу. Но так как вам не нужно читать сообщение для этого ...

Сначала извлеките узлы и отношения пути, используя функцию EXTRACT. Это даст вам результат в 2 столбца. Включите этот результат из 2 столбцов в POCO по собственному выбору, который принимает список узлов и RelationshipInstances. Затем загрузите запрос в этот вид объекта с помощью Projection. Вуаля!

Надеюсь, это поможет, это помогло мне.

+0

Рад, что вы его отсортировали в конце, и хороший пост об этом тоже –

+0

Отличный пост! У меня была такая же проблема, и я рад, что нашел ваш вопрос. Я буду использовать эту технику в своей платформе базы знаний Associativy. – Piedone

1

Вы пробовали:

ICypherFluentQueryReturned<PathsResult> query 
    = graphClient.Cypher 
        .StartWithNodeIndexLookup("n", "idx", "id", id) 
        .Match("p=(n)-[:RELATED_TO*0..2]-()") 
        .Return<PathsResult>("p"); 
IEnumerable<PathsResult> res = query.Results; 

Каждый из результатов res должно быть то, что вы после этого?

+0

Это выглядит хорошо. Однако мне нужно создать класс PathsResult. Есть идеи по этому поводу? Как и какие свойства должны быть, чтобы получить путь, десериализированный в него. –

+0

Это часть Neo4jclient, попробуйте поставить: 'using Neo4jClient.ApiModels.Cypher;' –

+0

, который делает путь, да. Благодарю. Однако путь все еще состоит из URL-адресов узлов и отношений. Как бы я пошел отсюда к получению каких-либо объектов или чего-то, что я мог бы использовать для заполнения объектов? –

0

Я начал с Chris Skardon's code (http://geekswithblogs.net/cskardon/archive/2013/07/23/neo4jclient-ndash-getting-path-results.aspx) и только начал снимать классы отношений, чтобы увидеть, будет ли это работать. Мне нравится решение Криса, потому что оно возвращает свойства узла, а также отношения (включая TypeKey) за один раз. Оказывается, вам не нужно создавать новые классы.

var queryResults = graphClient.Cypher 
       .Match("p=(n)-[:RELATED_TO|OTHER_RELATION*0..2]-()") 
       .Return(p => new 
       { 
        Nodes = Return.As<IEnumerable<Node<**YOUR_NODE_CLASS**>>>("nodes(p)"), 
        Relationships = Return.As<IEnumerable<RelationshipInstance<Dictionary<string,string>>>>("rels(p)") 
       }) 
       .Results; 
     resultsPath.Dump();//Use LINQPad to see the results 

Объект отношения, которые я использовал Dictionary<string,string> (который вы можете использовать вместо **YOUR_NODE_CLASS**) - для меня, нет никаких данных в RelationshipReference.Data поле, но я думаю, что если бы мои отношения имели свойства.

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