Neo4jClient加载索引

时间:2012-08-13 21:00:50

标签: c# insert indexing neo4j neo4jclient

Neo4J和.Net Neo4Jclient非常新,但我正在尝试启动并运行一个基本项目。是否有人使用索引向服务器添加节点的一些基本代码或示例,同时允许相同节点类型之间的关系?该项目的最终目标是创建普林斯顿Wordnet的图形版本 - http://wordnet.princeton.edu/

最初我试图在两个相同类型的节点之间创建关系,称之为Root Words。它们应该通过IS_SYNONYM关系相关联。根节点需要完全文本索引以允许搜索。这个“应该”允许我搜索给定词根的所有同义词。

这就是我看待这种关系的方式:

(RootWord1,类型[A] )< ==:[IS_SYNONYM] ==> (RootWord2,类型[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; }
        }
    }

我已经盯着这一段时间,所以任何帮助都非常感谢,谢谢。

1 个答案:

答案 0 :(得分:4)

以下代码会为根词添加同义词:(您可能想要检查您的&#39;字和&#39;同义词&#39;是否已经在数据库中,因此您可以创造一种关系)

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);
}

&#39; GetIndexEntries&#39;方法获取您想要放入对象索引(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&#39;,&#39; Great&#39; 您可以查询(使用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”。关系到实际的同义词。