sql >> データベース >  >> RDS >> Mysql

ノードのすべての親を取得するためのSPARQLクエリ

    データはRDFでdata.n3として表すことができます :

    @prefix : <http://example.org/> .
    @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
    
    :Network rdfs:subClassOf :Main .
    
    :ATM rdfs:subClassOf :Network .
    :ARPANET rdfs:subClassOf :Network .
    
    :Software rdfs:subClassOf :Main .
    
    :Linux rdfs:subClassOf :Software .
    :Windows rdfs:subClassOf :Software .
    
    :XP rdfs:subClassOf :Windows .
    :Win7 rdfs:subClassOf :Windows .
    :Win8 rdfs:subClassOf :Windows .
    

    ここからは、rdfs:subClassOfのパス(空のパスを含む)によって特定のクラスに接続されているすべてのものを検索するSPARQLクエリが必要です。 プロパティ。

    prefix : <http://example.org/>
    prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    
    select ?superclass where { 
      :Win7 rdfs:subClassOf* ?superclass
    }
    
    --------------
    | superclass |
    ==============
    | :Win7      |
    | :Windows   |
    | :Software  |
    | :Main      |
    --------------
    

    そのクエリの結果は、必ずしもパス内の位置で並べ替えられているとは限りません(ただし、この場合は順番に並べられています)。それらを順番に必要とする場合は、これを行うことができます(これは、位置の計算に関するこの回答に基づいていますRDFリスト内の要素の数 ):

    prefix : <http://example.org/>
    prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    
    select ?class where { 
      :Win7 rdfs:subClassOf* ?mid .
      ?mid rdfs:subClassOf* ?class .
    }
    group by ?class
    order by count(?mid)
    

    これにより、各祖先の?classが検索されます。 :Win7の 各?midと同様に 中間の祖先。祖先の場合?class 、距離は、(count(?mid)間の中間関係の数として計算されます。 )。その距離に基づいて結果を並べ替えるので、:Win7 最も近い祖先である:Windows その後など。

    あなたはこのようにあなたが望むいくつかの凝ったフォーマットをすることさえできます:

    prefix : <http://example.org/>
    prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    
    select (group_concat( ?name ; separator="--" )  as ?path) where {
      {
        select ?name where { 
          :Win7 rdfs:subClassOf* ?mid .
          ?mid rdfs:subClassOf* ?class .
          bind( strAfter( str(?class), "http://example.org/") as ?name )
        }
        group by ?class ?name
        order by count(?mid)
      }
    }
    
    -----------------------------------
    | path                            |
    ===================================
    | "Win7--Windows--Software--Main" |
    -----------------------------------
    

    かもしれない より洗練された文字列処理を実行し、複数行の文字列を取得することが可能です。 この回答 の後半をご覧ください。 アイデアのためのうまく整列されたマトリックスのためのいくつかの凝ったフォーマットがあります。




    1. MySqlは最後の10行をランダム化します

    2. ASP.NETとSQLServer間の接続プールの問題を解決するにはどうすればよいですか?

    3. LinqtoOracleを使用する方法はありますか

    4. MySQLのGRANTのテーブル名にワイルドカードを使用できますか