Используйте значение свойства вершины для создания ребра при программном обходе нескольких вершин - PullRequest
0 голосов
/ 13 октября 2018

Я обнаружил, что при импорте данных в график из БД или любого формата, в котором у меня есть отношения в качестве ключей столбцов, мне нужно создать Edges, используя эти ключи, которые уже являются свойствами в вершине.

Как пройти через все вершины, создавая края, с помощью этих FK, которые я уже ввел в график?

И мне нужно, чтобы это было осуществимо программно, потому что у меня много данных, где требуется этот шаг,В настоящее время я использую Gremlin.Net, потому что большая часть кода, который я использую, уже написана на C #

Пример: представьте, что я принял несколько клиентов

g.addV ('customer').property ('id', c_id) .property ('product', product_id)

И некоторые продукты

g.addV ('product'). property ('id', product_id)

Я хочу создать ребра, например: costumer [купленный-> проект] Как я могу использовать идентификаторы для создания ребер?Кажется, я не могу ссылаться на свойство в контексте его вершины.

Я хочу сделать что-то вроде:

gVhasLabel ('customer'). As ('c'). AddE ('куплено'). To (gV (c.product)))

Очевидно, что я не могу сделать c.product, и если есть какое-либо решение с использованием циклов, к сожалению, об этом не может быть и речи, поскольку Cosmos Graph его не поддерживает.

Пока чтоЯ прибегал к циклам в C #, но даже мои примеры данных не масштабируются.

1 Ответ

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

Возможно, есть более хороший способ сделать это, но я предложу следующее:

gremlin> g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV('customer').property('id', 321).property('productBought', 123)
==>v[0]
gremlin> g.addV('product').property('id', 123)
==>v[3]
gremlin> g.addV('customer').property('id', 987).property('productBought', 789)
==>v[5]
gremlin> g.addV('product').property('id', 789)
==>v[8]
gremlin> g.V().hasLabel('customer').as('c').
......1>   V().hasLabel('product').as('p').
......2>   where('p', eq('c')).
......3>     by('id').
......4>     by('productBought').
......5>   select('p').
......6>   addE('buys').from('c').to('p')
==>e[10][0-buys->3]
==>e[11][5-buys->8]

Эта концепция выше в некоторой степени основана на "значениях, вызванных обходом", которые описаны здесь более подробно.

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

Края лучше всего генерируются, когда знание о связи известно.Итак, если в какой-то момент вы знали, что «productBought» существует, то он должен был загружаться не как ключ свойства «productBought», а как грань вершины «product».Если вы сделаете такой выбор заранее в своей схеме, это сэкономит много трудностей позже.

...