0

私は R、neo4j、R-neo4j でプログラミングを始めたばかりなので、私の質問が些細なことである場合は、甘やかしてください。

R-neo4j と以下の R Project コード [2] を使用して、次のデータベース (添付の写真を参照してください) [1] を作成しました。

データベースには、4 人のプレイヤー間のコンピューター ゲームの試合結果が含まれています。データセットは、プレイヤー 1 からプレイヤー 4 までの 4 つのノードで構成されます。ノードは、試合の結果を示す "敗北" の関係を介して接続されます。次のデータを含む各関係に関連付けられた 2 つのラベル エントリがあります: ジャッジ、ゲーム。

Cypher クエリを使用してグラフ データベースから、次の形式でデータを抽出したいと考えています ([1] の図を参照してください)。

Winning player    Loosing player    Game         Judge
player 1          player 4          Starcraft    player 2
player 1          player 4          LOL          player 3
player 4          player 1          LOL          player 2
player 1          player 4          Starcraft    player 3
player 1          player 2          LOL          player 3
player 2          player 1          LOL          player 4
player 4          player 1          Starcraft    player 4

入力が「プレーヤー 1」で、上記のテーブルが返されるグラフ データベースにクエリを作成します (R-neo4j 環境で推奨)。

私の質問が明確で、誰かが私を助けてくれることを願っています。

良い一日を過ごしてください。

キリスト教徒

[1] https://goo.gl/cMxXHo

[2] R (Rneo4j) コード:

clear(graph)
Y
player1 = createNode(graph,"user",ID="Player 1",male=T)
player2 = createNode(graph,"user",ID="Player 2",male=T)
player3 = createNode(graph,"user",ID="Player 3",male=F)
player4 = createNode(graph,"user",ID="Player 4",male=F)

addConstraint(graph,"user","ID")

rel1 = createRel(player1,"defeats",player4)
rel2 = createRel(player1,"defeats",player4)
rel3 = createRel(player4,"defeats",player1)
rel4 = createRel(player1,"defeats",player4)
rel5 = createRel(player1,"defeats",player2)
rel6 = createRel(player2,"defeats",player1)
rel7 = createRel(player3,"defeats",player1)

rel1 = updateProp(rel1, game = "Starcraft", judge = "Player 2")
rel2 = updateProp(rel2, game = "League of Legends", judge = "Player 3")
rel3 = updateProp(rel3, game = "League of Legends", judge = "Player 2")
rel4 = updateProp(rel4, game = "Starcraft", judge = "Player 3")
rel5 = updateProp(rel5, game = "League of Legends", judge = "Player 3")
rel6 = updateProp(rel6, game = "League of Legends", judge = "Player 4")
rel7 = updateProp(rel7, game = "Starcraft", judge = "Player 4")
4

2 に答える 2

1

いくつかのこと。clear(graph)「Y」を入力せずに使用したい場合は、 を使用できますclear(graph, input=F)。また、知らなかった場合は、関係を作成するときに関係にプロパティを設定できます。

rel1 = createRel(player1, "defeats", player4, game="Starcraft", judge="Player 2")

質問に答えるには、次のようにします。

getDataForPlayer = function(name) {
  query = "
  MATCH (winner:user)-[game:defeats]->(loser:user)
  WHERE winner.ID = {name} OR loser.ID = {name}
  RETURN winner.ID AS `Winning Player`,
         loser.ID AS `Losing Player`,
         game.game AS Game,
         game.judge AS Judge
  "

  return(cypher(graph, query, name=name))
}

getDataForPlayer("Player 1")

出力:

  Winning Player Losing Player              Game    Judge
1       Player 4      Player 1 League of Legends Player 2
2       Player 2      Player 1 League of Legends Player 4
3       Player 3      Player 1         Starcraft Player 4
4       Player 1      Player 2 League of Legends Player 3
5       Player 1      Player 4         Starcraft Player 2
6       Player 1      Player 4 League of Legends Player 3
7       Player 1      Player 4         Starcraft Player 3
于 2015-05-18T11:44:56.053 に答える
0

あなたのグラフを見ると、正しい構造を持っていないことにちょっと気づきました。すべてのシナリオは異なる可能性がありますが、さらに多くのデータを追加するとどうなるかを常に検討することをお勧めします。あなたのモデルはそれを処理できますか?

たとえば、リレーションシップを使用してゲームの結果を表しているとします。この場合、もちろん、ジャッジとゲームを格納するための属性が必要です。ゲーム名は実際にはトーナメント ゲームのように見えますが、どれがより効果的かがわかります。プレイヤー名とトーナメント名を保存すると、同じ名前とプレイヤーがどこにでも現れるため、多くの繰り返しが発生します。

プレーヤー間で結果を追加し続けると、最終的に多くの関係が生まれ、エラーと繰り返しの可能性が増え続けます。

その場合、モデルを改善するために何ができますか? 基本的な関係を出発点と考えてください。しかし、今では元の要件を超えています。トーナメント用のノードとゲーム用のノードを導入できます。ゲーム内のプレーヤーの役割などを保存するための関係を維持します。それを行う方法は常に複数あります (TIMTOWTDI)。

百聞は一見に如かずということを考えると、ここで改善されたモデルを見てください。

改善されたグラフ モデル モデル内の対応するノードまたは関係に追加のプロパティを追加する方が簡単であることがわかります。

結果を含む目的のテーブルを作成するには、次を使用できます。

MATCH
  (g:Game)-[:WINNER]->(w:Player),
  (g)-[:LOSER]->(l:Player),
  (g)-[:JUDGE]->(j:Player),
  (g)<-[:HAS_GAMES]-(t:Tournament)
WHERE
  w.name = 'Player 1' OR l.name = 'Player 1'
RETURN
  w.name AS 'Winning Player',
  l.name AS 'Losing Player',
  t.name AS 'Game',
  j.name AS 'Judge'

ニコールが提案するようにRに適応します。多くのデータを追加するふりをする場合、この構造はニーズによりよく適応すると思います。また、トーナメントから開始したり、ゲームを直接探索したりできるようになったため、同じデータをクエリするさまざまな方法を探索することもできます。

于 2015-05-24T11:19:00.387 に答える