1

Neo4J と .Net Neo4Jclient は初めてですが、基本的なプロジェクトを立ち上げて実行しようとしています。同じノードタイプ間の関係を許可しながら、インデックスを使用してサーバーにノードを追加するための基本的なコードまたは例を誰かが持っていますか? プロジェクトの最終的な目標は、Princeton Wordnet のグラフ バージョンを作成することです - http://wordnet.princeton.edu/

最初に、同じタイプの 2 つのノード間の関係を作成しようとしています。それらをルート ワードと呼びます。これらは、IS_SYNONYM 関係を介して関連付ける必要があります。検索できるようにするには、ルート ノードに完全にテキスト インデックスを付ける必要があります。これにより、特定のルート ワードのすべての類義語を検索できるようになるはずです。

これは私が関係を見る方法です:

(RootWord1, Type[A] ) < ==:[IS_SYNONYM] == > (RootWord2, Type[A] )

そして、これらは私が始めた基本的な構造です:

public class RootWord
    {
        [JsonProperty()]             
        public string Term { get; set; }
    }

public class IsSynonym : Relationship
        , IRelationshipAllowingSourceNode<RootWord>
        , IRelationshipAllowingTargetNode<RootWord>
    {
        public const string TypeKey = "IS_SYNONYM";

        public IsSynonym(NodeReference targetNode)
            : base(targetNode){}

        public IsSynonym(NodeReference targetNode, object data)
            : base(targetNode, data){}

        public override string RelationshipTypeKey
        {
            get { return TypeKey; }
        }
    }

私はこれをしばらく見つめていたので、どんな助けも大歓迎です、ありがとう。

4

1 に答える 1

4

以下のコードは、ルートワードにシノニムを追加します: (おそらく、「単語」と「シノニム」が既にデータベースにあるかどうかを確認して、関係を作成することができます)

public static void AddNodeToDb(IGraphClient graphClient, string index, RootWord word, RootWord synonym)
{
    if (!graphClient.CheckIndexExists(index, IndexFor.Node))
    {
        var configuration = new IndexConfiguration { Provider = IndexProvider.lucene, Type = IndexType.fulltext };
        graphClient.CreateIndex(index, configuration, IndexFor.Node);
    }

    var wordReference = graphClient.Create(word, null, GetIndexEntries(word, index));
    var synonymReference = graphClient.Create(synonym, null, GetIndexEntries(synonym, index));
    graphClient.CreateRelationship(wordReference, new IsSynonym(synonymReference));

    Console.WriteLine("Word: {0}, Synonym: {1}", wordReference.Id, synonymReference.Id);
}

「GetIndexEntries」メソッドは、用語しかないので、オブジェクト (RootWord) のインデックスに入れたいエントリを取得します。これは簡単です。

private static IEnumerable<IndexEntry> GetIndexEntries(RootWord rootWord, string indexName)
{
    var indexKeyValues =
        new List<KeyValuePair<string, object>>
            {
                new KeyValuePair<string, object>("term", rootWord.Term)
            };

    return new[]
               {
                   new IndexEntry
                       {
                           Name = indexName,
                           KeyValues = indexKeyValues.Where(v => v.Value != null)
                       }
               };
}

たとえば、「Ace」、「Great」と入力したとします。次のように (Cypher を使用して) クエリを実行できます。

START n=node(0)
MATCH n-[:IS_SYNONYM]->res
RETURN res

(ノード0があなたが望むルートワードであると仮定します!)これは「素晴らしい」ノードを返します。同時に、全文索引も作成したため、次のコードを使用してルートワードを検索できます。

public static void QueryTerms(IGraphClient gc, string query)
{
    var result = gc.QueryIndex<RootWord>("synonyms", IndexFor.Node, "term:" + query).ToList();
    if (result.Any())
        foreach (var node in result)
            Console.WriteLine("node: {0} -> {1}", node.Reference.Id, node.Data.Term);
    else
        Console.WriteLine("No results...");
}

これらのノードを取得したら、「IS_SYNONYM」関係をたどって実際のシノニムを取得できます。

于 2012-08-14T13:23:48.497 に答える