1

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

最初我试图在相同类型的两个节点之间创建关系,称它们为根词。它们应该通过 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 是您想要的根词!)这将返回“伟大”节点。同时,因为我们还创建了全文索引,所以可以使用以下代码搜索rootword:

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 回答