Я работаю над импортом импорта для новой графической базы данных.
Он должен работать с:
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 не выполняет Встроенная поддержка нескольких меток для его вершин.
Реализации сервера, такие как AWS Нептун будет поддерживать это с помощью разделителя , например. 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
)?