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; }
}
}
我已经盯着这一段时间,所以任何帮助都非常感谢,谢谢。
答案 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”。关系到实际的同义词。