Я работаю над средством импорта для новой базы данных графов.
Он должен работать с:
Amazon Neptune - реализация Gremlin, имеет отличную поддержку инфраструктуры в производственной среде, но с ней сложно работать локально, и она не поддерживает Cypher. Инструмент визуализации не предусмотрен.
Janusgraph - с ним легко работать локально как с реализацией Gremlin, но для поддержки производства требуются большие инвестиции, следовательно, с использованием Amazon Neptune. Инструмент визуализации не предоставляется.
Neo4j - отличный инструмент визуализации, язык Cypher кажется очень знакомым, работает даже с клиентами Gremlin, но требует значительных инвестиций для поддержки в производстве, и, похоже, нет инструмента визуализации, который был бы где-нибудь почти так же хорош, как один найденный в Neo4j, который работает с реализациями Gremlin.
Итак, я создаю график, в котором сущности (узлы / вершины) имеют несколько типов (меток), некоторые из которых ортогональны друг другу, а также многомерны.
Например, Сущность, представляющая заказ, сделанный онлайн, будет помечена как Order
, Online
, Spend
, Transaction
.
| Spend Chargeback
----------------------------------------
Transaction | Purchase Refund
Line | Sale Return
Увеличиваем столбец Spend
.
| Online Instore
----------------------------------------
Purchase | Order InstorePurchase
Sale | OnlineSale InstoreSale
В Neo4j и его языке запросов Cypher это оказывается очень мощным средством для создания Отношений / Ребер между несколькими типами без явного знания того, какие transaction_id
значения находятся на графике:
MATCH (a:Transaction), (b:Line)
WHERE a.transaction_id = b.transaction_id
MERGE (a)<-[edge:TRANSACTED_IN]-(b)
RETURN count(edge);
Проблема в том, что Gremlin / Tinkerpop изначально не поддерживает несколько меток для своих Verticies.
Такие серверные реализации, как AWS Neptune, будут поддерживать это используя разделитель, например. Order::Online::Spend::Transaction
и клиент Gremlin поддерживает его для сервера Neo4j, но Мне не удалось найти пример, где это работает для JanusGraph.
В конечном итоге мне нужно иметь возможность выполнить запрос Gremlin, эквивалентный приведенному выше Cypher:
g
.V().hasLabel("Line").as("b")
.V().hasLabel("Transaction").as("a")
.where("b", eq("a")).by("transaction_id")
.addE("TRANSACTED_IN").from("b").to("a")';
Итак, здесь есть несколько вопросов:
- Есть ли способ заставить JanusGraph принимать несколько меток вершин?
- Если это невозможно или это не лучший подход, нужно ли добавить дополнительное свойство вершины, содержащее список меток?
- В случае варианта 2 должно ли имя метки быть меткой высокого уровня (
Transaction
) или меткой низкого уровня (Order
)?