Возможно ли использование нескольких вершинных меток в Gremlin / Janusgraph или альтернативное решение лучше? - PullRequest
1 голос
/ 06 января 2020

Я работаю над импортом импорта для новой графической базы данных.

Он должен работать с:

  • 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")';

Итак, здесь есть несколько вопросов:

  1. Есть ли способ заставить JanusGraph принимать несколько меток вершин?
  2. Если это невозможно, или это не лучший подход, должно ли быть дополнительное свойство вершины, содержащее список меток?
  3. В случае варианта 2 имя метки должно быть высоким метка высокого уровня (Transaction) или метка низкого уровня (Order)?

1 Ответ

3 голосов
/ 08 января 2020

Есть ли способ заставить JanusGraph принимать несколько меток вершин?

Нет, в JanusGraph нет способа иметь несколько меток вершин.

Если это невозможно, или это не лучший подход, должно ли быть дополнительное свойство вершины, содержащее список меток?

В случае варианта 2, должно ли название метки быть меткой высокого уровня (Транзакция) или меткой низкого уровня (Заказ)?

Я отвечу на эти два вместе. Исходя из того, что вы описали выше, я бы создал одну метку, вероятно, с именем Transaction, и с различными свойствами, связанными с ними, такими как Location (Online или InStore) и Type (Покупка, Возврат, Возврат, Возвратный платеж и т. Д. c.) , Глядя на то, как вы описываете проблему выше, вы на самом деле говорите только об одной сущности, о Транзакции, где все остальные элементы, которые вы используете в качестве меток (Online / InStore, Spend / Refund), на самом деле являются просто дополнительными метаданными о том, как произошла эта Транзакция. Таким образом, вышеупомянутый подход позволил бы простую фильтрацию по одному или нескольким из этих атрибутов, чтобы достичь всего, что можно было бы сделать с несколькими метками, которые вы используете в Neo4j.

...