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

Вы бы использовать такой запрос 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
Я получаю ваш ответ «по дизайну» :) Большое спасибо. Я устанавливаю это как «Принятый ответ». Функция GraphEdgeAttribute - это предложение от меня. Я попытался найти эту функцию в linq для entity, db4o. На стороне cypher не имеет смысла получать Nodes-Relations (Classes-RelatedProperties) в виде таблицы и снова конвертировать их обратно в объекты. Там должно быть лучше подходят для этого:. – ozz
graphClient .RootNode .OUT (HasUser.TypeKey) .LoadOut (HasCar.TypeKey, с => C.Color == "Красный") AsProperty ("Тачки") –
ozz
Или graphClient.RootNode.Out (HasUser.TypeKey) .LoadProperty («Автомобили», node => node.Out (HasCar.TypeKey)) Это может быть лучше :) Да, для этого решения нет необходимости использовать GraphAttribute , –
ozz