Можно ли различить свойства с одинаковыми именами, принадлежащие одной и той же вершине, в запросе MATCH в Nebula Graph?

Играю с Nebula Graph 2.0.0.

Я создаю два тега, оба содержат свойство под названием:

      create tag t1(name string)
create tag t2(name string)

Теперь я вставляю вершину, наделяя ее свойством:

      > insert vertex t1(name) values '1': ('first-name');
Execution succeeded (time spent 2730/95913 us)

Я вижу, что его можно найти по ID:

      > match (x:t1) where id(x) == '1' return x
+-------------------------------+
| x                             |
+-------------------------------+
| ("1" :t1{name: "first-name"}) |
+-------------------------------+
Got 1 rows (time spent 2713/95756 us)

Я также могу найти его по ID и :

      > match (x:t1) where id(x) == '1' and x.name == 'first-name' return x
+-------------------------------+
| x                             |
+-------------------------------+
| ("1" :t1{name: "first-name"}) |
+-------------------------------+
Got 1 rows (time spent 2827/100963 us)

Теперь назначаю той же вершине:

      insert vertex t2(name) values '1': ('second-name');

Добавлен ок:

      > match (x:t1) where id(x) == '1' return x

+--------------------------------------------------------+
| x                                                      |
+--------------------------------------------------------+
| ("1" :t1{name: "first-name"} :t2{name: "second-name"}) |
+--------------------------------------------------------+
Got 1 rows (time spent 3579/96685 us)

И я все еще могу искать по ID и :

      > match (x:t1) where id(x) == '1' and x.name == 'first-name' return x
+--------------------------------------------------------+
| x                                                      |
+--------------------------------------------------------+
| ("1" :t1{name: "first-name"} :t2{name: "second-name"}) |
+--------------------------------------------------------+
Got 1 rows (time spent 2534/96306 us)

Но когда я ищу по идентификатору и ничего не найдено:

      > match (x:t1) where id(x) == '1' and x.name == 'second-name' return x
Empty set (time spent 3383/96788 us)

Так что, вероятно, под капотом система думает, что я хочу искать, поэтому ничего не находит.

В другом сеансе с тегами, названными по-другому, у меня было другое поведение: после добавления второго свойства я потерял возможность поиска первым, но можно было искать, используя второе name.

Вот мои вопросы:

  1. Законно ли иметь одинаковые свойства вершины с одинаковым именем (но из разных тегов)?
  2. Если да, то как я могу попросить исполнителя запроса использовать конкретное свойство (например, t1.name или же t2.name а не тот, который система выбирает автоматически)?

1 ответ

Хороший улов! На самом деле тег не является родным для OpenCypher, мы работаем над поддержкой все большего количества функций OpenCypher и над его улучшением. 1 Под капотом сопоставление свойств вершин основано на индексе туманности, который теперь основан только на одном теге (на самом деле это левое совпадение ключей RocksDB). 2, когда сопоставление условия/индекса было выполнено, в MATCHcall, вы можете вернуть все реквизиты тегов, принадлежащие ему.

Законно ли вообще иметь свойства одной и той же вершины с одинаковым именем (но из разных тегов)?

Это законно. Но, может быть, в большинстве случаев nameможет быть одинаковым в обоих тегах?

Собственно, вот WHERE CLAUSE: where id(x) == '1'подобен первичному ключу, поэтому одна вершина уже указана. В вашем случае использования это все еще необходимо для дальнейшего ANDсостояние, подскажите?

Если да, то как я могу попросить исполнителя запроса использовать конкретное свойство (например, t1.name или t2.name, а не то, которое система выбирает автоматически)?

По причине: 1(индекс реквизита может поддерживать только один тип тега/ребра) теперь мы можем фильтровать только в пределах одного тега, поэтому это либо t1.name, либо t2.name, например t1.name == "foo" и t1. возраст > 18.

Интересный случай, который вы нашли(), заключается в том, что выбор проп-индекса (который является выбором на основе правил, на данный момент будет больше улучшений) не может быть выполнен из-за id(v) == 123не основан на проп-индексе, а проп-индексы обоих тегов имеют «имя».

Чтобы избежать этого, возможно, нам не следует разрешать одно и то же имя свойства для тегов, принадлежащих одной и той же вершине, с разными значениями, это можно улучшить из документации или кода.

Другие вопросы по тегам