Уникальные вершины с фреймами

Существует ли потокобезопасный способ обеспечить создание уникальных вершин каркасным графом? Рассмотрим следующее:

Node n = framedGraph.addVertex(1, Node.class);
Node m = framedGraph.addVertex(1, Node.class);
System.out.println(n.equals(framedGraph.getVertex(1, Node.class)));
System.out.println(m.equals(framedGraph.getVertex(1, Node.class)));

печатает true, false.

Я ищу функциональность, аналогичную получить или создать уникальную функциональность узла, предоставляемую Neo4j (в данном случае это вспомогательный граф).

Кстати, есть ли способ использовать нечисловые идентификаторы?

Node m = framedGraph.addVertex("http://example.org", Node.class);
System.out.println(n.equals(framedGraph.getVertex("http://example.org", Node.class)));

печатает false


person condit    schedule 17.10.2013    source источник


Ответы (1)


Neo4j и большинство реализаций Blueprints Graph игнорируют параметр ID. Помимо TinkerGraph, они обычно назначают свои собственные идентификаторы без методов для создания собственных. Вы всегда можете использовать IdGraph, чтобы смоделировать собственный идентификатор.

Blueprints не поддерживает понятие «получить или создать». Вы должны реализовать это самостоятельно, или я полагаю, что для этого можно обратиться к коду Neo4j, ожидая, что ваш код больше не будет переносим с одного графа на другой. Таким образом, возможно, вы могли бы создать реализацию оболочки графа, подобную IdGraph, которая раскрывала метод getOrCreate(). По крайней мере, таким образом вы все еще можете работать с интерфейсом Graph, и такая логика инкапсулирована внутри него. Конечно, это не поможет включить такую ​​​​функциональность непосредственно во фреймах.

person stephen mallette    schedule 18.10.2013
comment
Спасибо! Это решает проблему с идентификатором. Но теперь, когда я добавляю вершину в граф с рамкой, а затем добавляю эту вершину в мой созданный вручную индекс (index.put("term", "foo1", n.asVertex());), я получаю исключение: com.tinkerpop.blueprints.util.wrappers.id.IdVertex cannot be cast to com.tinkerpop.blueprints.impls.neo4j.Neo4jElement. Любой способ решить это? - person condit; 18.10.2013
comment
Я думаю, вам нужно развернуть файл IdVertex. Попробуйте взять экземпляр IdVertex и вызвать getBaseVertex перед передачей его в индекс. tinkerpop.com/docs/javadocs/blueprints/2.4.0/com/tinkerpop/ - person stephen mallette; 18.10.2013
comment
Да - ((IdVertex)n.asVertex()).getBaseVertex() делает свое дело. Спасибо большое. - person condit; 19.10.2013