Можно ли различить свойства с одинаковыми именами, принадлежащие одной и той же вершине, в запросе 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
.
Вот мои вопросы:
- Законно ли иметь одинаковые свойства вершины с одинаковым именем (но из разных тегов)?
- Если да, то как я могу попросить исполнителя запроса использовать конкретное свойство (например,
t1.name
или жеt2.name
а не тот, который система выбирает автоматически)?
1 ответ
Хороший улов! На самом деле тег не является родным для OpenCypher, мы работаем над поддержкой все большего количества функций OpenCypher и над его улучшением. 1 Под капотом сопоставление свойств вершин основано на индексе туманности, который теперь основан только на одном теге (на самом деле это левое совпадение ключей RocksDB). 2, когда сопоставление условия/индекса было выполнено, в
MATCH
call, вы можете вернуть все реквизиты тегов, принадлежащие ему.
Законно ли вообще иметь свойства одной и той же вершины с одинаковым именем (но из разных тегов)?
Это законно. Но, может быть, в большинстве случаев
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
не основан на проп-индексе, а проп-индексы обоих тегов имеют «имя».
Чтобы избежать этого, возможно, нам не следует разрешать одно и то же имя свойства для тегов, принадлежащих одной и той же вершине, с разными значениями, это можно улучшить из документации или кода.