2012-04-28 8 views
0

GraphDb сторонаКак я могу загрузить вершину с соответствующей вершиной в виде коллекции

Vertex: Пользователь

Край: Имеет

Vertex: Автомобиль

Side Object

public class User { 
    public string Name { get; set; } 

    [GraphEdge("HAS_CAR")] 
    public ICollection<Car> Cars { get; set; } 
} 

Задача

Я хочу получить информацию о пользователе X с автомобилями от Neo4J через Gremlin? (Я использую Neo4jClient)

Это так похоже Включить метод Linq к Entity ..

С наилучшими пожеланиями

ответ

0

Огуз,

Теперь, когда вы обновили этот вопрос, я понимаю лучше.

GraphEdgeAttribute не является частью Neo4jClient, поэтому я не уверен, откуда он взялся.

В Neo4jClient мы не загружаем глубокие объекты. То есть мы не будем отслеживать свойства и загружать дополнительные коллекции. Мы делаем это, потому что: а) это потребует от нас большого количества обращений к серверу, и б) мы думаем, что вы должны четко указывать, какие данные вы действительно хотите загрузить.Мы не хотим быть эквивалентом проекта Spring Data для Neo4j, потому что я не считаю, что это хороший подход.

Похоже, вы можете захотеть взглянуть на Сайфера вместо Гремлина. Это позволит вам загружать данные в виде таблиц, включая проекции из нескольких узлов.

- Tatham

+0

Я получаю ваш ответ «по дизайну» :) Большое спасибо. Я устанавливаю это как «Принятый ответ». Функция GraphEdgeAttribute - это предложение от меня. Я попытался найти эту функцию в linq для entity, db4o. На стороне cypher не имеет смысла получать Nodes-Relations (Classes-RelatedProperties) в виде таблицы и снова конвертировать их обратно в объекты. Там должно быть лучше подходят для этого:. – ozz

+0

graphClient .RootNode .OUT (HasUser.TypeKey) .LoadOut (HasCar.TypeKey, с => C.Color == "Красный") AsProperty ("Тачки") – ozz

+0

Или graphClient.RootNode.Out (HasUser.TypeKey) .LoadProperty («Автомобили», node => node.Out (HasCar.TypeKey)) Это может быть лучше :) Да, для этого решения нет необходимости использовать GraphAttribute , – ozz

1

Предполагая, что график, как это:

Sample graph

Вы бы использовать такой запрос Gremlin, чтобы получить все автомобили, для всех пользователей:

g.v(0).out('HAS_USER').out('HAS_CAR') 

Теперь, позволяет фильтровать вниз только красные автомобили:

g.v(0).out('HAS_USER').out('HAS_CAR').filter { it.Color == "Red" } 

Наконец, вы хотите, чтобы пользователи вместо автомобилей. Легче всего думать о том, как Гремлин работает как настоящий гремлин (маленькое существо). Вы сказали ему бежать к пользователям, затем к каждому из автомобилей, а затем проверить цвет каждой машины. Теперь вам нужно, чтобы он вернулся к пользователям, из которых он пришел. Чтобы сделать это, мы ставим отметку в запросе следующим образом:

g.v(0).out('HAS_USER').as('user').out('HAS_CAR').filter { it.Color == "Red" }.back('user') 

Чтобы написать это в C# с Neo4jClient тогда очень похожи:

graphClient 
    .RootNode 
    .Out<User>(HasUser.TypeKey) 
    .As("user") 
    .Out<Car>(HasCar.TypeKey, c => c.Color == "Red") 
    .BackV<User>("user") 

Единственное отличие в том, что вам нужно использовать BackE или BackV для ребер и вершин, соответственно, только Back. Это связано с тем, что в статическом мире C# нам нужно использовать разные имена методов, чтобы иметь возможность возвращать разные типы перечислителей.

Я надеюсь, что это поможет! :)

- Tatham

+0

Я обновил вопрос. Я так неудачливый человек из-за заботы на стороне Microsoft. У нас нет «Spring Data Neo4j». Возможно, это небольшой вопрос, связанный с отображением объекта-графа. Я хочу получить объект User с загруженным свойством Cars из Neo4j. Как я могу достичь этого прозрачно? GraphEdgeAttribute? – ozz

+0

Хорошо, теперь я понимаю ваш вопрос лучше. Я напишу еще один ответ. –

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

  • Нет связанных вопросов^_^