在GraphDB平台(Neo4j,OrientDB,FlockDB,HyperGraphDB ......)中,可以定义节点之间的关系。
我需要定义方向关系,以便关系根据其方向具有不同的名称。
例如:
Parent(A,B) := Sibling(B,A).
然后,我想使用术语和方向遍历或查询图表。
当然,我不想定义两个关系,只需要一个。
有时我甚至想使用非方向名称,例如:
Call(A,B) := Answer(B,A);
TalkWith(A,B) := Call(A,B) || Call(B,A)
使用定向或间接遍历/查询
例如,我可能想问:
Get any X that TalkWith(A,X))
或
Get any X that Call(A,X))
或
Get any X that Answer(A,X))
哪些现有的GraphDB平台支持它?
答案 0 :(得分:5)
在Gremlin(http://gremlin.tinkerpop.com)中,您可以根据数据中的显式创建抽象/隐式/推断关系。因此,您可以通过这种方式定义推理。
https://github.com/tinkerpop/gremlin/wiki/User-Defined-Steps
Gremlin在TinkerGraph,Neo4j,OrientDB,DEX和RDF Sail Stores上工作。
希望有所帮助, 马尔科。
答案 1 :(得分:2)
这听起来像是UI级问题,而不是数据库级问题。您试图将定向关系映射到人性化的名称。
对于Neo4j,您可以将此信息放入自定义RelationshipType:
public enum MyRelationshipType implements RelationshipType
{
CHILD("Parent Of", "Child Of");
public MyRelationshipType(final String forwardString, final String backwardString)
{
this.forwardString = forwardString;
this.backwardString = backwardString;
}
private final String backwardString;
private final String forwardString;
public String getDisplayString(final boolean forward)
{
if (forward)
{
return this.forwardString;
}
else
{
return this.backwardString;
}
}
}
答案 2 :(得分:1)
在InfoGrid中,我们有无向关系的概念。例如,“HasMet”:如果A人遇到了B,B必然也会遇到A,A和B在关系中扮演相同的角色。
请注意,单向性超出了命名范围,它是一种核心语义概念,可能会被数据库或建模语言理解,也可能不会被理解。
此外,在InfoGrid中,您可以自己定义一些TraversalSpecifications并将它们替换为您喜欢的任何内容,包括基本遍历(转到与特定类型的关系相关的邻居),或者多步遍历(例如,转到您的叔叔)妈妈的一面)。