Какой самый быстрый способ найти ребро между двумя заданными вершинами в orientDB - PullRequest
0 голосов
/ 25 апреля 2018

В настоящее время у меня есть 2 коллекции вершин с именами community и user. Каждый пользователь, который является членом сообщества, связан с этим сообществом, используя границу community_user.

Я пытаюсь обновить ребро community_user для данного пользователя, его _id и заданного community его _id.

SELECT read from community_user where 
     outV() in (select @rid FROM `community` WHERE ( `_id` = '5ab283c35b6b9435d4c9a958' )) 
     and 
     inV() in (select @rid from user where _id  = 'x5mxEBwhMfiLSQHaK')

Этот запрос работает, хотя он довольно медленный, когда ребро community_user заполняется.

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

Мои текущие соответствующие индексы на community._id и user._id

EXPLAIN этого запроса приводит к:

{
    "result": [
        {
            "@type": "d",
            "@version": 0,
            "documentReads": 1,
            "fullySortedByIndex": false,
            "documentAnalyzedCompatibleClass": 1,
            "recordReads": 1,
            "fetchingFromTargetElapsed": 0,
            "indexIsUsedInOrderBy": false,
            "currentMatch": null,
            "compositeIndexUsed": 1,
            "current": "#169:839",
            "depth": 0,
            "involvedIndexes": [
                "user._id"
            ],
            "limit": -1,
            "matched": {
                "$ORIENT_DEFAULT_ALIAS_0": "#1770:0",
                "theEdge": "#1817:1889"
            },
            "evaluated": 1,
            "elapsed": 1490.7661,
            "resultType": "collection",
            "resultSize": 1,
            "@fieldTypes": "documentReads=l,documentAnalyzedCompatibleClass=l,recordReads=l,fetchingFromTargetElapsed=l,compositeIndexUsed=l,current=x,involvedIndexes=e,evaluated=l,elapsed=f"
        }
    ],
    "notification": "Query executed in 1.521 sec. Returned 1 record(s)"
}

1 Ответ

0 голосов
/ 26 апреля 2018

Самый простой способ - использовать оператор MATCH

MATCH
  {class:community, where:(_id = '5ab283c35b6b9435d4c9a958' )}
    .outE(){as:theEdge}.inV(){class:user, where:(_id  = 'x5mxEBwhMfiLSQHaK')}
RETURN $elements
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...